2013-12-02 2 views
0

Я создал список Listview, заполненный с помощью list_row_layout.xml (который заполнен сериализуемым классом json), у меня есть интерактивное текстовое представление и onclick изменение текста с «Accept» на «Accepted». Но когда я нажимаю его на первом элементе listview, меняются другие элементы списка просмотра textview ниже. Вот некоторые фотографии, чтобы описав вам лучшеAndroid Viewview clickable textview

before clicking the accept textview

After clicking the fist accept textview

это класс адаптера

public class CustomListAdapter extends BaseAdapter { 

    private ArrayList<FeedItem> listData; 

    private LayoutInflater layoutInflater; 

    private Context mContext; 

    public CustomListAdapter(Context context, ArrayList<FeedItem> listData) { 
      this.listData = listData; 
      layoutInflater = LayoutInflater.from(context); 
      mContext = context; 
    } 

    @Override 
    public int getCount() { 
      return listData.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
      return listData.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
      return position; 
    } 


    public View getView(int position, View convertView, ViewGroup parent) { 
      final ViewHolder holder; 
      if (convertView == null) { 
        convertView = layoutInflater.inflate(R.layout.list_row_layout, null); 

        holder = new ViewHolder(); 
        holder.headlineView = (TextView)convertView.findViewById(R.id.sex); 
        holder.reportedDateView = (TextView) convertView.findViewById(R.id.confid); 
        holder.approve = (TextView) convertView.findViewById(R.id.approveTV); 



        holder.approve.setOnClickListener(new OnClickListener() 
        { 
         @Override 

       public void onClick(View argView) 
        { 
       holder.approve.setText("Accepted"); 
       } 
        } 
       ); 

        convertView.setTag(holder); 
      } else { 
        holder = (ViewHolder) convertView.getTag(); 
      } 

      FeedItem newsItem = (FeedItem) listData.get(position); 
      holder.headlineView.setText(Html.fromHtml(newsItem.getTitle())); 
      holder.reportedDateView.setText(Html.fromHtml(newsItem.getContent())); 




      return convertView; 
    } 



    static class ViewHolder { 
      TextView approve; 
      TextView headlineView; 
      TextView reportedDateView; 
      ImageView imageView; 

    } 
    } 
+2

вид переработки. измените данные в модели, а не в представлении. – njzk2

+1

@ njzk2 Есть ли какая-то особая причина, по которой вы добавили комментарий, который просто перекликается с ответом, который я уже дал? –

+0

На самом деле, не прокручивался до вашего ответа в то время. Я в основном написал этот комментарий в качестве напоминания в случае, если я захотел в какой-то момент вникать в фактический ответ. – njzk2

ответ

3

Помните, что мнения могут быть переработаны с помощью convertView.

В вашем методе OnClick установить одобрять текст «Принято», но когда вид переработаны, вы никогда не установить его в «Принять»

На самом деле вам нужно обновить (что-то в) список в ответ щелкнуть и включить значение Accept/Accepted на основе этого значения, а не просто обновлять то, что в данный момент отображается на экране.

- ответить "как" вопрос (спрашивает ниже) -

Добавить новое поле в ViewHolder

static class ViewHolder { 
     TextView approve; 
     TextView headlineView; 
     TextView reportedDateView; 
     ImageView imageView; 
     FeedItem newsItem; 
} 

Изменить метод OnClick:

  public void onClick(View argView) 
      { 
       // note that holder no longer needs to be final in the parent class 
       // because it is not used here. 
       View parent = (View)argView.getParent(); 
       ViewHolder clickedHolder = (ViewHolder)parent.getTag(); 
       clickedHolder .newsItem.setAccepted(true); /// a new method 
       clickedHolder .approve.setText ("Accepted"); 
       Log.d(TAG, "Accepted item #" + position); 
      } 

После вас имеют преобразованныйView (при необходимости)

 FeedItem newsItem = (FeedItem) listData.get(position); 
     holder.newsItem = newsItem; // populate the new field. 
     holder.headlineView.setText(Html.fromHtml(newsItem.getTitle())); 
     holder.reportedDateView.setText(Html.fromHtml(newsItem.getContent())); 
     if(newsItem.isAccepted()){ // another new method! 
      holder.approve.setText ("Accepted"); 
      Log.d(TAG, "Set text to Accepted for item #" + position); 
     }else{ 
      holder.approve.setText("Accept"); 
      Log.d(TAG, "Set text to Accept for item #" + position); 
     } 

После того, как он работает, вы должны рассмотреть возможность удаления строк Log.d(), чтобы сократить шум в LogCat.

+0

Можете ли вы привести мне пример? –

+0

textView не является кликабельным, ничего не происходит при нажатии на него –

+0

Добавьте сообщения журнала, чтобы убедиться, что вы достигаете метода onClick. Я отредактирую ответ, чтобы показать эти сообщения. Результаты должны появиться в LogCat. –

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