2016-03-23 4 views
0

Ich habe die folgende Aktivität, die eine ListView verwendet, um eine Liste der Themen anzuzeigen. Jede Zeile hat eine Textansicht, die auf Rot gesetzt ist, um anzuzeigen, dass die Frage für dieses Thema noch nicht beantwortet wurde. Wenn der Benutzer auf eine Zeile klickt, sollte eine Aktivität gestartet werden, die eine Frage zu diesem Thema stellt.StartActivityForResult zum Aktualisieren einer Zeile in einem ListView

Ich möchte die Aktivität starten durch Aufruf von startActivityForResult, dies wird die Zeile mit der Tatsache aktualisieren, die Frage gestellt wurde und drehen Sie die Textansicht grün.

Meine Frage ist, wie man eine bestimmte Zeile in der Listenansicht von OnActivityResult aktualisieren?

public class QuestionListForInTransaction extends ActionBarActivity { 

    ListView listView; 


     public void onCreate(Bundle icicle) { 
      super.onCreate(icicle); 

      setContentView(R.layout.questionlistforintxlayout); 
      getSupportActionBar().setDisplayShowHomeEnabled(true); 
      getSupportActionBar().setIcon(R.drawable.ic_launcher); 
      setTitle("Call Question(s)"); 

      listView = (ListView)findViewById(R.id.txinquestionlist); 

      String[] values = new String[] { "Are you the driver?", "Question 2", "Question 3", }; 


      MySimpleArrayAdapter adapter = new MySimpleArrayAdapter(this, values); 
      listView.setAdapter(adapter); 
      listView.setOnItemClickListener(listener); 




      }//end of onCreate 




      public class MySimpleArrayAdapter extends ArrayAdapter<String> { 
       private final Context context; 
       private final String[] values; 

       public MySimpleArrayAdapter(Context context, String[] values) { 
       super(context, R.layout.questionlisttxinrowlayout, values); 
       this.context = context; 
       this.values = values; 
       } 

       @Override 
       public View getView(int position, View convertView, ViewGroup parent) { 

       LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       View rowView = inflater.inflate(R.layout.questionlisttxinrowlayout, parent, false); 

       TextView question = (TextView) rowView.findViewById(R.id.tvquestionforintx); 
       question.setText(values[position]); 

       TextView answered = (TextView) rowView.findViewById(R.id.rowstatusbox); 
       answered.setBackgroundColor(Color.RED); 

       String questionStr = values[position]; 
       rowView.setTag(questionStr); 


       return rowView; 

       } 




      } //end of adapter class 



      OnItemClickListener listener = new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       //Toast.makeText(QuestionListForInTransaction.this, "pos = " + position, Toast.LENGTH_LONG).show(); 

       String question = (String)view.getTag(); 

       if(question.equalsIgnoreCase("Are you the driver?")){ 

        //Toast.makeText(QuestionListForInTransaction.this, "Are you the driver?" + position, Toast.LENGTH_LONG).show(); 

        final int QUESTION_REQUEST = 1; 
        Intent questionIntent = new Intent(QuestionListForInTransaction.this, Question.class); 
        startActivityForResult(questionIntent, QUESTION_REQUEST); 

        //TextView answered = (TextView) view.findViewById(R.id.rowstatusbox); 
        //answered.setBackgroundColor(Color.GREEN); 

       } 


      } 
     }; 


     @Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent intent){ 
      super.onActivityResult(requestCode, resultCode, intent); 
      Bundle extras = intent.getExtras(); 
      if(extras != null) 
      int result = extras.getInt("result"); 

      //*********************update a row green********************** 
     } 

    } //end of class 
+0

Sie können benutzerdefinierte Klasse erstellen und zwei Werte String und boolean haben und den Booleschen Wert false setzen, wenn Sie das Ergebnis erhalten. Dann benachrichtigen Sie den Adapter. – Keshav

Antwort

2

Erstellen Sie einfach einige benutzerdefinierte Wrapper-Klasse wie folgt aus:

public class QuestionWrapper { 
private String mQuestionText; 
private boolean mIsAsked; 

public QuestionWrapper(String defaultQuestionText, boolean isAsked) { 
    mQuestionText = defaultQuestionText; 
    mIsAsked = isAsked; 
} 

public boolean isAsked() { 
    return mIsAsked; 
} 

public void setIsAswked(boolean isAsked) { 
    mIsAsked = isAsked; 
} 

public String getQuestionText() { 
    return mQuestionText; 
} 

}

dann müssen Sie Liste dieser Wrapper auf Adapter:

public class QuestionListForInTransaction extends ActionBarActivity { 
    List<QuestionWrapper> mWrappers = new ArrayList<>(); 
    MySimpleArrayAdapter mAdapter; 

...

public void onCreate(Bundle icicle) { 
    .... 
    wrappers.add(new QuestionWrapper("Are you the driver?",false)); 
    wrappers.add(new QuestionWrapper("Question 2",false)); 
    wrappers.add(new QuestionWrapper("Question 3",false)); 

    mAdapter = new MySimpleArrayAdapter(this, wrappers); 
    .... 
Ihr Adapter wie diese

und Update:

public class MySimpleArrayAdapter extends ArrayAdapter<QuestionWrapper> { 
    private final Context context; 
    private final List<QuestionWrapper> mWrappers; 

    public MySimpleArrayAdapter(Context context, List<QuestionWrapper> wrappers) { 
     super(context, R.layout.questionlisttxinrowlayout, wrappers); 
     this.context = context; 
     this.mWrappers = wrappers; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.questionlisttxinrowlayout, parent, false); 
     QuestionWrapper wrapper = mWrappers.get(position); 
     TextView question = (TextView) rowView.findViewById(R.id.tvquestionforintx); 
     question.setText(wrapper.getQuestionText()); 

     TextView answered = (TextView) rowView.findViewById(R.id.rowstatusbox); 
     if (wrapper.isAsked()) { 
      answered.setBackgroundColor(Color.GREEN); 
     } else { 
      answered.setBackgroundColor(Color.RED); 
     } 

     rowView.setTag(wrapper.getQuestionText()); 

     return rowView; 

    } 

onActivityResult - Müssen Sie Ihre Wrapper-Klasse und Adpater aktualisieren:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent){ 
    super.onActivityResult(requestCode, resultCode, intent); 
    .... 
    mWrappersList.get(yourPosition).setAsked(true/false); 
    if (mAdapter!=null){ 
    mAdapter.notifyDataSetChanged(); 
    } 
    ... 
} 

Ich denke, für RequestCode in startActivityForResult Sie Adapter Einrastposition verwenden können.

+0

hey danke, dass du dir die Zeit dafür genommen hast, dankbar! Ich bekomme jedoch 1 Fehler, "kann nicht verweisen auf ein Instanzfeld mWrappers beim expliziten Aufrufen eines Konstruktors" dies ist für die mWrappers-Variable im Super-Teil des Adapter-Konstruktors. – turtleboy

+0

http://pastebin.com/2CxR1XnU nehmen Sie eine bessere Probe für Sie –

+0

Ich habe gerade den mWapper in der äußeren Klasse umbenannt. Vielen dank für Deine Hilfe :) – turtleboy

Verwandte Themen