2016-03-23 1 views
0

У меня есть следующее действие, которое использует ListView для отображения списка объектов. Каждая строка имеет текстовое представление, для которого задано значение красного цвета, чтобы указать, что вопрос для этого объекта еще не ответил. Когда пользователь нажимает на строку, он должен запустить Activity, задающий вопрос по этому вопросу.StartActivityForResult для обновления строки в ListView

Я хочу запустить Activity, вызвав 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

Вы можете создать собственный класс и иметь два значения 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 - нужно обновить класс обертку и 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(); 
    } 
    ... 
} 

Я думаю, для RequestCode в startActivityForResult вы можете использовать адаптер позиции щелчка.

+0

эй спасибо за то, что нашли время, чтобы это сделать, оценили! Тем не менее, я получаю 1 ошибку «Не могу ссылаться на поле экземпляра mWrappers при явном вызове конструктора», это для переменной mWrappers в суперчастице адаптера constuctor. – turtleboy

+0

http://pastebin.com/2CxR1XnU возьмите лучший образец для вас –

+0

Я просто переименовал mWapper в классе outter. Большое спасибо за вашу помощь :) – turtleboy

 Смежные вопросы

  • Нет связанных вопросов^_^