2016-05-07 18 views
0

我有一個像下面的圖像列表視圖。如何同時選擇兩個列表項目?要具體只有兩個項目不超過

enter image description here

現在我要選擇在同一時間列表視圖只可以在兩個項目並意圖下一個活動同時通過列表視圖項的值。我怎樣才能實現它?

如果兩個項目都沒有選擇設置驗證嗎?

AdapterClass

public class LoadAdapter extends BaseAdapter { 
    private ArrayList<DataBase> mProductItems; 
    private LayoutInflater mLayoutInflater; 
    private Context mContext; 
    DBHelper mydb; 
    DataBase stringItem; 
    public LoadAdapter(Context context, ArrayList<DataBase> arrayList){ 
     mContext = context; 
     mProductItems = arrayList; 
     mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     Log.e("testtt", String.valueOf(mProductItems.size())); 
     return mProductItems.size(); 

    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 



    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     final ViewHolder holder; 

     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = mLayoutInflater.inflate(R.layout.load_chart_item, parent, false); 
      holder.txtv_name = (TextView) convertView.findViewById(R.id.text); 
      holder.nameid = (TextView) convertView.findViewById(R.id.nameid); 
      holder.btn_delete = (Button) convertView.findViewById(R.id.btn_delete); 
      holder.btn_edit = (Button)convertView.findViewById(R.id.btn_edit); 
      holder.location = (TextView)convertView.findViewById(R.id.loc); 
      holder.img= (ImageView)convertView.findViewById(R.id.img); 
      holder.btn_delete.setTag(position); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder)convertView.getTag(); 
     } 

     mydb = new DBHelper(mContext); 

     stringItem = mProductItems.get(position); 

     if (stringItem != null) { 
      if (holder.txtv_name != null) { 

       holder.txtv_name.setText(stringItem.getName()); 
       holder.nameid.setText(stringItem.getId()); 
       holder.location.setText(stringItem.getLocation()); 
       Log.e("saved Location values",stringItem.getLocation()); 
      } 
     } 


if(selected.get(position)) 
    { 
     //for selected row 
     holder.img.setBackgroundResource(R.drawble.myimg) 
    } 
    else 
    { 
     // for not selected row 

    } 


     holder.btn_delete.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       DataBase test = mProductItems.get(position); 
       String id = test.getId(); 

       mydb.deleteContact(Integer.valueOf(id)); 
       mProductItems.remove(mProductItems.get(position)); 
       LoadAdapter.this.notifyDataSetChanged(); 


       if (mProductItems.size() == 0){ 
        mProductItems.clear(); 
        LoadAdapter.this.notifyDataSetChanged(); 
       } 



      } 
     }); 




     Log.e("DataBase", String.valueOf(mydb.getAllCotacts())); 

     holder.btn_edit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Intent intent=new Intent(mContext,UpdateData.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

       SharedPreferences preff = PreferenceManager.getDefaultSharedPreferences(mContext); 
       SharedPreferences.Editor edi = preff.edit(); 
       edi.putString("key",String.valueOf(position+1)); 
       edi.apply(); 

       mContext.startActivity(intent); 
      } 
     }); 

       return convertView; 
    } 

    public void refresh(ArrayList<DataBase> items) 
    { 
     this.mProductItems = items; 
     notifyDataSetChanged(); 
    } 


    private static class ViewHolder { 
     ImageView img; 
     TextView txtv_name,nameid,location; 
     Button btn_delete,btn_edit; 
    } 
} 

主類

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.DisplayMetrics; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 

import java.util.ArrayList; 


public class LoadChart extends AppCompatActivity { 
    public final static String EXTRA_MESSAGE = "MESSAGE"; 
    private SwipeListView listView; 
    DBHelper mydb; 
    Button det; 
    LoadAdapter loadAdapter; 
    ArrayList<DataBase> array_list; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.load_chart); 


     mydb = new DBHelper(this); 
     array_list = mydb.getAllCotacts(); 
     Log.e("logging", String.valueOf(array_list)); 
    // ArrayAdapter<String> arrayAdapter=new ArrayAdapter<String>(this,R.layout.load_chart_item,R.id.text, array_list); 

      det = (Button)findViewById(R.id.reli); 

     listView = (SwipeListView) findViewById(R.id.listview); 
     listView.setAdapter(new LoadAdapter(getApplicationContext(),array_list)); 


     det.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      String str = ""; 
      str = relationAdapter.getSelected(); 
      Toast.makeText(RelationShipChartList.this, str, Toast.LENGTH_SHORT).show(); 

     } 
    }); 


     listView.setSwipeListViewListener(new BaseSwipeListViewListener() { 
      int openItem = -1; 
      int lastOpenedItem = -1; 
      int lastClosedItem = -1; 

      @Override 
      public void onOpened(int position, boolean toRight) { 
       lastOpenedItem = position; 

       int index = position - listView.getFirstVisiblePosition(); 
       View view = listView.getChildAt(index); 
       Button delete = (Button) view.findViewById(R.id.btn_delete); 
       Button edit = (Button) view.findViewById(R.id.btn_edit); 

       if (!toRight) { 

        delete.setVisibility(View.VISIBLE); 
        edit.setVisibility(View.VISIBLE); 

       } 


       if (openItem > -1 && lastOpenedItem != lastClosedItem) { 
        listView.closeAnimate(openItem); 


       } 
       openItem = position; 
      } 


      @Override 
      public void onStartClose(int position, boolean right) { 
       Log.d("swipe", String.format("onStartClose %d", position)); 
       lastClosedItem = position; 

      } 

      @Override 
      public void onClosed(int position, boolean fromRight) { 

       int index = position - listView.getFirstVisiblePosition(); 
       View view = listView.getChildAt(index); 
       Button delete = (Button) view.findViewById(R.id.btn_delete); 
       Button edit = (Button) view.findViewById(R.id.btn_edit); 



       if (!fromRight) { 

        delete.setVisibility(View.INVISIBLE); 
        edit.setVisibility(View.INVISIBLE); 

       } 

      } 

      @Override 
      public void onListChanged() { 

      } 

      @Override 
      public void onMove(int position, float x) { 

      } 

      @Override 
      public void onStartOpen(int position, int action, boolean right) { 
      } 

      @Override 
      public void onClickFrontView(int position) { 

       int id_To_Search = position; 

       DataBase test = array_list.get(position); 
       String id = test.getId(); 
       String name = test.getName(); 
       String loc = test.getLocation(); 
       String dt = test.getDate(); 
       String time = test.getTime(); 

       Bundle dataBundle = new Bundle(); 
       dataBundle.putString("name",name); 
       dataBundle.putString("date",dt); 
       dataBundle.putString("time",time); 
       dataBundle.putString("location",loc); 
       dataBundle.putInt("id", Integer.parseInt(id)); 
       Intent intent = new Intent(getApplicationContext(),LoadedChart.class); 
       intent.putExtras(dataBundle); 
       startActivity(intent); 

      } 

      @Override 
      public void onClickBackView(int position) { 

       Log.e("swipe", String.format("onClickBackView %d", position)); 
      } 

      @Override 
      public void onDismiss(int[] reverseSortedPositions) { 

      } 

     }); 
    } 

    public int convertDpToPixel(float dp) { 
     DisplayMetrics metrics = getResources().getDisplayMetrics(); 
     float px = dp * (metrics.densityDpi/160f); 
     return (int) px; 
    } 
    @Override 
    public void onResume() 
    { 
     super.onResume(); 
     Set_Referash_Data(); 

    } 


    public void Set_Referash_Data() { 
     array_list.clear(); 
     mydb = new DBHelper(this); 

     ArrayList<DataBase> con = mydb.getAllCotacts(); 

     for (int i = 0; i < con.size(); i++) { 

      String tidno = con.get(i).getId(); 
      String name = con.get(i).getName(); 
      String cons = con.get(i).getCon(); 
      String loc = con.get(i).getLocation(); 
      DataBase cnt = new DataBase(); 
      cnt.setId(tidno); 
      cnt.setName(name); 
      cnt.setCon(cons); 
      cnt.setLocation(loc); 
      array_list.add(cnt); 

      Log.e(String.valueOf(array_list),"RefreshData"); 

     } 
     mydb.close(); 


     array_list = mydb.getAllCotacts(); //reload the items from database 
     LoadAdapter ld = new LoadAdapter(getApplicationContext(),array_list); 
     listView.setAdapter(ld); 
     ld.refresh(array_list); 
     ld.notifyDataSetChanged(); 
     Log.e(String.valueOf(array_list),"RefreshData Final"); 
    } 

} 

logcat的

05-09 14:47:50.706 29939-29939/com.example.user.humandesignsample E/AndroidRuntime: FATAL EXCEPTION: main 
                        Process: com.example.user.humandesignsample, PID: 29939 
                        java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.user.humandesignsample.RelationAdapter.getSelected()' on a null object reference 
                         at com.example.user.humandesignsample.RelationShipChartList$1.onClick(RelationShipChartList.java:45) 
                         at android.view.View.performClick(View.java:5204) 
                         at android.view.View$PerformClick.run(View.java:21153) 
                         at android.os.Handler.handleCallback(Handler.java:739) 
                         at android.os.Handler.dispatchMessage(Handler.java:95) 
                         at android.os.Looper.loop(Looper.java:148) 
                         at android.app.ActivityThread.main(ActivityThread.java:5417) 
                         at java.lang.reflect.Method.invoke(Native Method) 
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

使用'檢查Box'用'名單View'它會更容易做到這一點。 –

+0

如果我用自己的圖標而不是複選框怎麼辦? –

+0

如果你使用你的圖標,那麼確保它是一個選擇器。更好,我建議你做的是'複選框'。 –

回答

1

您可以簡單地在項目選擇上放一個計數器。

以一個變量爲例說。

int count = 0; 

檢查作爲選擇標記項目之前該變量/取消:

if(item.isSelected()) 
{ 
    // you need to make is disable 
    if(count>0) 
    { 
     count--; 
     // // mark item as deselected 
    } 
} 
else 
{ 
    // make it selected 
    if(count<2) 
    { 
     count++; 
     // mark item as selected 
    } 
} 

這會讓你選擇只有兩個項目在同一時間。

修改您的適配器是這樣的:

public class LoadAdapter extends BaseAdapter { 
private ArrayList<DataBase> mProductItems; 
private LayoutInflater mLayoutInflater; 
private Context mContext; 
DBHelper mydb; 
DataBase stringItem; 
ArrayList<Boolean> selected = new ArrayList<>(); 
private int count=0; 

public LoadAdapter(Context context, ArrayList<DataBase> arrayList){ 
    mContext = context; 
    mProductItems = arrayList; 
    mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    for (int i = 0; i < arrayList.size(); i++) { 

     selected.add(false); 

    } 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    Log.e("testtt", String.valueOf(mProductItems.size())); 
    return mProductItems.size(); 

} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return 0; 
} 



@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    final ViewHolder holder; 

    if (convertView == null) { 
     holder = new ViewHolder(); 
     convertView = mLayoutInflater.inflate(R.layout.load_chart_item, parent, false); 
     holder.txtv_name = (TextView) convertView.findViewById(R.id.text); 
     holder.nameid = (TextView) convertView.findViewById(R.id.nameid); 
     holder.btn_delete = (Button) convertView.findViewById(R.id.btn_delete); 
     holder.btn_edit = (Button)convertView.findViewById(R.id.btn_edit); 
     holder.location = (TextView)convertView.findViewById(R.id.loc); 
     holder.btn_delete.setTag(position); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder)convertView.getTag(); 
    } 

    mydb = new DBHelper(mContext); 

    stringItem = mProductItems.get(position); 

    if (stringItem != null) { 
     if (holder.txtv_name != null) { 

      holder.txtv_name.setText(stringItem.getName()); 
      holder.nameid.setText(stringItem.getId()); 
      holder.location.setText(stringItem.getLocation()); 
      Log.e("saved Location values",stringItem.getLocation()); 
     } 
    } 

    if(selected.get(position)) 
    { 
     //for selected row 
     holder.txtv_name.setTextColor(color.red); 
    } 
    else 
    { 
     // for not selected row 
     holder.txtv_name.setTextColor(color.black); 
    } 

    holder.txtv_name.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      if(holder.txtv_name.getCurrentTextColor()== R.color.black) 
      { 
       //is not selected 
       if(count<2) 
       { 
        count++; 
        selected.set(position,true); 

        // mark item as selected 
       } 
      } 
      else 
      { 
       //is selected 
       if(count>0) 
       { 
        count--; 
        selected.set(position,false); 

        // // mark item as deselected 
       } 
      } 
      notifyDataSetChanged(); 
     } 
    }); 


    holder.btn_delete.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      DataBase test = mProductItems.get(position); 
      String id = test.getId(); 

      mydb.deleteContact(Integer.valueOf(id)); 
      mProductItems.remove(mProductItems.get(position)); 
      LoadAdapter.this.notifyDataSetChanged(); 


      if (mProductItems.size() == 0){ 
       mProductItems.clear(); 
       LoadAdapter.this.notifyDataSetChanged(); 
      } 



     } 
    }); 




    Log.e("DataBase", String.valueOf(mydb.getAllCotacts())); 

    holder.btn_edit.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      Intent intent=new Intent(mContext,UpdateData.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

      SharedPreferences preff = PreferenceManager.getDefaultSharedPreferences(mContext); 
      SharedPreferences.Editor edi = preff.edit(); 
      edi.putString("key",String.valueOf(position+1)); 
      edi.apply(); 

      mContext.startActivity(intent); 
     } 
    }); 

    return convertView; 
} 

public void refresh(ArrayList<DataBase> items) 
{ 
    this.mProductItems = items; 
    notifyDataSetChanged(); 
} 


private static class ViewHolder { 
    TextView txtv_name,nameid,location; 
    Button btn_delete,btn_edit; 
}} 

編輯2:對於從適配器獲得選擇的項目在 適配器定義以下方法,並與像一個適配器對象調用它:adp.getSelected()

public String getSelected() { 
    String selectedString = ""; 
    int num=0; 
    for (int i = 0; i < selected.size(); i++) { 
     if (selected.get(i)) { 
      num++; 
      if (num == 1) { 
       selectedString = mProductItems.get(i).getName(); 
      } else { 
       selectedString += "," + mProductItems.get(i).getName(); 
      } 
     } 
    } 
    return selectedString; 
} 

對問題2的回答:如果您想要改用ImageView的文字顏色變化。做與上述相同的事情,但替換TextView +顏色ImageView +圖像

編輯3:

您呼籲從對象getSelected()方法。修改你的代碼是這樣的:

listView = (SwipeListView) findViewById(R.id.listview); 
loadAdapter = new LoadAdapter(getApplicationContext(),array_list); 
    listView.setAdapter(loadAdapter); 


    det.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

     String str = ""; 
     str = loadAdapter.getSelected(); 
     Toast.makeText(RelationShipChartList.this, str, Toast.LENGTH_SHORT).show(); 

    } 
+0

你能告訴我什麼是物品? –

+0

我不知道你的代碼。所以我剛剛給出了一個**項**的例子。 Item可以是你的** CheckBox **,** TextView **你正在使用的任何東西。如果你想讓我解釋你準備提出我的建議的確切位置,請分享你的adpater代碼。 –

+0

我想設置這個完整的listview行嗎?如何設置它 –

相關問題