2016-03-23 7 views
0

私は以下のListViewを使用してサブジェクトのリストを表示するアクティビティを作成しました。各行にはテキストビューがあり、そのテキストビューは赤色に設定され、その件名の質問にまだ回答していないことを示します。ユーザーが行をクリックすると、その主題に関する質問をするアクティビティが起動されます。StartActivityForResultを使用してListView内の行を更新する

startActivityForResultを呼び出すことでアクティビティを起動したい場合は、質問が尋ねられたという事実で行を更新し、テキストビューを緑に変えます。

私の質問は、どのようにリストビューの特定の行をonActivityResultから更新するのですか?

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

カスタムクラスを作成し、2つの値Stringとbooleanを持つことができ、結果を取得するとブール値をfalseに設定できます。アダプタに通知します。 – Keshav

答えて

2

ただ、このようないくつかのカスタムラッパークラスを作成します。そして、あなたはアダプタに、このラッパーのリストを設定する必要が

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; 
} 

}

を:

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); 
    .... 

と、このようなあなたのアダプタ更新:

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 - あなたのラッパークラスや特殊なアダプタを更新する必要があります。

@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(); 
    } 
    ... 
} 

を私はあなたがアダプタのクリック位置を使用することができますstartActivityForResultでRequestCodeのためだと思います。

+0

これを行うには時間を割いてくれてありがとう、ありがとう!私は1つのエラーが発生しているが、 "インスタンスフィールドを参照することはできませんmWrappers明示的にコンストラクタを呼び出す"これは、アダプタのコンストラクタのスーパー部分のmWrappers変数です。 – turtleboy

+0

http://pastebin.com/2CxR1XnUより良いサンプルを取る –

+0

私は、outterクラスのmWapperの名前を変更しました。あなたの助けをありがとうたくさん:) – turtleboy

関連する問題