2016-02-24 5 views
0

Я использую настраиваемый базовый адаптер списка. при передаче значениям адаптера его повторяющихся значений. и в viewholder Я использую флажок, и при этом этот флажок автоматически выбирает каждый шестой флажок после этого.просмотр списка повторяющихся значений несколько раз и повторение выбора флажка после 6-го значения

здесь мой адаптер полный код.

public class CallLogAdapter extends BaseAdapter { 

private Activity activity; 
private LayoutInflater li; 
List<CallLogInfo> callData; 
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); 
Context context; 
static Boolean checkboxstate[]; 
ArrayList<MultipleSelectedContact> mainDataList; 
int i = 0; 

public CallLogAdapter(Activity activity, List<CallLogInfo> callData, ArrayList<MultipleSelectedContact> selectedContacts) { 
    this.activity = activity; 
    this.callData = callData; 
    this.mainDataList = selectedContacts; 
    context = activity; 
    checkboxstate = new Boolean[callData.size()]; 
} 

// View lookup cache 
private static class ViewHolder { 
    TextView phoneNo, date, addComment, duration; 
    CheckBox checkBox; 
    CardView card; 
    ImageView callTypeImage; 
    int count; 
} 


@Override 
public int getCount() { 
    if (callData != null && callData.size() != 0) { 
     return callData.size(); 
    } 
    return 0; 
} 

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

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

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


    View v = convertView; 
    final ViewHolder viewHolder; // view lookup cache stored in tag 

    if (v == null) { 
     li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = li.inflate(R.layout.single_card, parent, false); 
     viewHolder = new ViewHolder(); 

     viewHolder.card = (CardView) v.findViewById(R.id.card_view); 
     viewHolder.callTypeImage = (ImageView) v.findViewById(R.id.callTypeImage); 
     viewHolder.phoneNo = (TextView) v.findViewById(R.id.phoneNoText); 
     viewHolder.date = (TextView) v.findViewById(R.id.dateText); 
     viewHolder.duration = (TextView) v.findViewById(R.id.callDurationText); 
     viewHolder.checkBox = (CheckBox) v.findViewById(R.id.checkBox); 
     viewHolder.addComment = (TextView) v.findViewById(R.id.addCommentText); 

     v.setTag(viewHolder); 

    } else { 
     viewHolder = (ViewHolder) v.getTag(); 
    } 

    viewHolder.count = position; 

    final CallLogInfo Info; 
    Info = callData.get(position); 
    switch (Info.callType) { 
     case "Outgoing": 
      viewHolder.callTypeImage.setImageResource(R.mipmap.up_arrow); 
      break; 
     case "Incoming": 
      viewHolder.callTypeImage.setImageResource(R.mipmap.down_arrow); 
      break; 
     case "Missed": 
      viewHolder.callTypeImage.setImageResource(R.mipmap.miss_arrow); 
      break; 
    } 
    viewHolder.phoneNo.setText(Info.phoneNo); 
    viewHolder.date.setText(Info.date); 
    viewHolder.duration.setText(Info.duration); 
    viewHolder.addComment.setTag(viewHolder.count); 
    viewHolder.checkBox.setTag(viewHolder.count); 


    if (checkboxstate[((int) viewHolder.checkBox.getTag())] == null) { 
     checkboxstate[((int) viewHolder.checkBox.getTag())] = false; 
    } 
    viewHolder.checkBox.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      // TODO Auto-generated method stub 
      if (((CheckBox) view).isChecked()) { 
       checkboxstate[((int) viewHolder.checkBox.getTag())] = true; 
       mainDataList.add(i, new MultipleSelectedContact()); 
       mainDataList.get(i).phoneNoS = Info.phoneNo; 
       mainDataList.get(i).setIsSelected(viewHolder.checkBox.isSelected()); 
       map.put(((int) viewHolder.checkBox.getTag()), i); 
       i++; 
       view.setSelected(true); 
      } else { 
       checkboxstate[((int) viewHolder.checkBox.getTag())] = false; 
       mainDataList.remove(map.get(((int) viewHolder.checkBox.getTag()))); 
       view.setSelected(false); 
      } 
     } 
    }); 

    viewHolder.addComment.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // custom dialog 
      final Dialog dialog = new Dialog(context); 
      dialog.setContentView(R.layout.activity_add_comment); 
      dialog.setTitle("Add Comment Here.."); 
      // set the custom dialog components - text, image and button 
      final EditText text = (EditText) dialog.findViewById(R.id.messageEditText); 

      Button dialogButton = (Button) dialog.findViewById(R.id.messageAddButton); 
      // if button is clicked, close the custom dialog 
      dialogButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        String comment = text.getText().toString(); 

        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, "CallLogDb", null); 
        SQLiteDatabase db = helper.getWritableDatabase(); 
        DaoMaster daoMaster = new DaoMaster(db); 
        DaoSession session = daoMaster.newSession(); 
        CallCommentsDetailDao callCommentDao = session.getCallCommentsDetailDao(); 

        CallCommentsDetail commentInfo = new CallCommentsDetail(); 

        commentInfo.setCommentId(position); 
        commentInfo.setComments(comment); 
        callCommentDao.insertOrReplace(commentInfo); 

        session.clear(); 
        db.close(); 

        dialog.dismiss(); 
       } 
      }); 

      dialog.show(); 

     } 
    }); 

    viewHolder.card.setTag(position); 
    viewHolder.card.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(context, MessageContentActivity.class); 
      intent.putExtra("callDetails", Info); 
      context.startActivity(intent); 
     } 
    }); 

    return v; 

} 
} 

Здесь, в коде, где я использую ((int) viewHolder.checkBox.getTag()). Я также попытался использовать позицию. но все еще его не работает .. может кто-нибудь, пожалуйста, помогите мне узнать, куда я иду не так.

ответ

1

Установите состояние флажка на GetView

if (checkboxstate[((int) viewHolder.checkBox.getTag())] == null) { 
    checkboxstate[((int) viewHolder.checkBox.getTag())] = false; 
} 
viewholder.checkbox.setChecked(checkboxstate[((int)viewHolder.checkBox.getTag())]); 
+0

эй морозного спасибо за помощь .. это решить мою проблему .. можно сказать, у такого же, как для одного добавить комментарий текста там .. на нажав на это, я просто сохраняю некоторые комментарии, связанные с этим телефоном. и тот же комментарий повторяется ?? –

+0

эй извините, я не понял ваш вопрос ?? Не могли бы вы немного разобраться. – Frosty

0

Вы можете использовать SparseBooleanArray, чтобы сохранить состояния флажка вместо установки его как тега, и вы не устанавливаете флажок состояние в getView() метод как

viewholder.checkbox.setChecked(booleanArray.valueAt(position)) 

затем переключить состояние на OnClick() что-то вроде

booleanArray.put(position,!booleanArray.valueAt(position)); 
notifyDataSetChanged(); 

Также listItemClick не будет работать должным образом, если список содержит ряд checkb быков или кнопок. Используйте Recyclerview для лучшей настройки и производительности. Sample Implementation of recyclerview