0

我有以下使用 ListView 显示主题列表的 Activity。每行都有一个设置为红色的文本视图,表示该主题的问题尚未得到回答。当用户点击一行时,它应该启动一个 Activity 来询问关于该主题的问题。

我想通过调用 startActivityForResult 来启动 Activity,这将使用已提出问题的事实更新行并将 textview 变为绿色。

我的问题是如何从 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
4

1 回答 1

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 - 需要更新你的包装类和 adpater:

@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,您可以使用适配器单击位置。

于 2016-03-23T15:05:36.230 回答