2013-12-14 63 views
1

我通過json解析使用AsyncTask填充列表視圖。在列表視圖的每一行中,我都有一個按鈕。我想爲他們寫onclickLister。爲列表視圖的每一行設置按鈕onclick事件

enter image description here

我想,當我點擊添加到購物車的名稱和價格和數量的數據保存到sqlite的。

public void addtocart(){ 
     Button btnaddtocart=(Button)findViewById(R.id.btnInsertToCart); 
     final TextView tname=(TextView)findViewById(R.id.nameNewItem); 
     final EditText eqty=(EditText)findViewById(R.id.updateQty); 
     final TextView tprice=(TextView)findViewById(R.id.priceNewItem); 

     btnaddtocart.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       try { 
        if(eqty.getText().toString().equalsIgnoreCase("")){ 
         Toast.makeText(getApplicationContext(),"Please enter the Quantity.",Toast.LENGTH_LONG).show(); 
        } 
        else { SQLiteDatabase database = openOrCreateDatabase("ORCL", MODE_PRIVATE, null); 
         database.execSQL("CREATE TABLE IF NOT EXISTS CART(id integer primary key autoincrement,title VARCHAR(150),qty INT(10),price INT(10));"); 
         database.execSQL("INSERT INTO CART(title,qty,price) VALUES('" + tname.getText().toString() + "'," + Integer.parseInt(eqty.getText().toString())+"," 
           + Integer.parseInt(tprice.getText().toString())+");"); 

         database.close(); 
         eqty.setText(null); 

         //hide keyboard 
         InputMethodManager imm = (InputMethodManager)getSystemService(
           Context.INPUT_METHOD_SERVICE); 
         imm.hideSoftInputFromWindow(eqty.getWindowToken(), 0); 

         Toast.makeText(getApplicationContext(),"Add to Cart",Toast.LENGTH_LONG).show();} 

       } 
       catch (Exception ex){ 
        Toast.makeText(getApplicationContext(),ex.getMessage(),Toast.LENGTH_LONG).show(); 
       } 
      } 
     }); 

但我的問題是我應該寫代碼的以下代碼部分:

public class Update extends Activity { 
    ListView list; 
    Button Btngetdata; 
    ProgressDialog pDialog; 
    ArrayList<HashMap<String, String>> newItemlist = new ArrayList<HashMap<String, String>>(); 
    private static final String TAG_ITEM = "NewItem"; 
    private static final String TAG_NAME = "name"; 
    private static final String TAG_DESCRIPTION = "description"; 
    private static final String TAG_PRICE = "price"; 
    ConnectionDetector cd; 
    Boolean isInternetPresent = false; 
    @Override 
    protected void onCreate(Bundle bundle) { 
     super.onCreate(bundle); 
     setContentView(R.layout.updateapp); 
     pDialog = new ProgressDialog(Update.this); 
     pDialog.setMessage("Getting Data ..."); 

     newItemlist = new ArrayList<HashMap<String, String>>(); 
     Btngetdata = (Button)findViewById(R.id.getdata); 
     cd = new ConnectionDetector(getApplicationContext()); 
     Btngetdata.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       isInternetPresent = cd.isConnectingToInternet(); 
       if (isInternetPresent) { 
       new JSONParse().execute(); } 
       else { 
        Toast.makeText(getApplicationContext(),"You don't have internet connection.",Toast.LENGTH_LONG).show(); 
       } 

      } 
     }); 


    } 
    private class JSONParse extends AsyncTask<String, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog.show(); 
     } 
     @Override 
     protected Void doInBackground(String... args) { 
      try { 
       Log.i("...............", "Hello.............."); 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       HttpGet httpPost = new HttpGet("http://www.karocellen.com/newItem.json"); 
       HttpResponse httpResponse = httpClient.execute(httpPost); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       String jsonstring = EntityUtils.toString(httpEntity); 
       Log.i("...............",jsonstring); 
       JSONObject json = new JSONObject(jsonstring); 
       JSONArray newitem = json.getJSONArray(TAG_ITEM); 
       for(int i = 0; i < newitem.length(); i++){ 
        JSONObject c = newitem.getJSONObject(i); 
        String name = c.getString(TAG_NAME); 
        String description = c.getString(TAG_DESCRIPTION); 
        String price = c.getString(TAG_PRICE); 
        Log.i("...............",name); 
        HashMap<String, String> map = new HashMap<String, String>(); 
        map.put(TAG_NAME, name); 
        map.put(TAG_DESCRIPTION, description); 
        map.put(TAG_PRICE, price); 
        newItemlist.add(map); 
       } 

      } catch (Exception ex){ 


      } 
      return null; 

     } 
     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      pDialog.dismiss(); 
      list=(ListView)findViewById(R.id.listupdate); 
      ListAdapter adapter = new SimpleAdapter(Update.this, newItemlist, 
        R.layout.updateapprow, 
        new String[] { TAG_NAME,TAG_DESCRIPTION, TAG_PRICE }, new int[] { 
        R.id.nameNewItem,R.id.descriptionNewItem, R.id.priceNewItem}); 
      list.setAdapter(adapter);    

    } 
    } 
+0

我會使用自定義適配器。代碼中的按鈕在哪裏? – Raghunandan

+0

@Raghunandan,無處。我不知道在哪裏定義它們。 – samira

+0

做一個谷歌搜索自定義適配器。 – Raghunandan

回答

3

使用CustomAdapter。

您需要了解的ListView是如何工作的

How ListView's recycling mechanism works

傳遞活動場景和列表NewItems到自定義適配器的構造。

@Override 
    protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      pDialog.dismiss(); 
      list=(ListView)findViewById(R.id.listupdate); 
      CustomAdapter cus = new CustomAdapter(MainActivtiy.this,newItemlist); 
      list.setAdapter(cus);    

    } 

使用包含文字和按鈕的自定義版面。將它命名爲list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginLeft="33dp" 
     android:layout_marginTop="40dp" 
     android:text="TextView" /> 

    <TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/textView1" 
     android:layout_centerHorizontal="true" 
     android:text="TextView" /> 

    <TextView 
     android:id="@+id/textView3" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/textView2" 
     android:layout_marginLeft="34dp" 
     android:layout_toRightOf="@+id/textView2" 
     android:text="TextView" /> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_below="@+id/textView3" 
     android:layout_marginTop="20dp" 
     android:text="Button" /> 

</RelativeLayout> 

充氣佈局,初始化和更新的意見。在按鈕上設置Listener可以執行所需的操作。

public class CustomAdapter extends BaseAdapter 
    { 
     LayoutInflater mInlfater; 
     ArrayList<HashMap<String,String>> list; 
     public CustomAdapter(Context context,ArrayList<HashMap<String,String>> list) 
     { 
      mInlfater = LayoutInflater.from(context); 
      this.list =list; 
     } 
     @Override 
     public int getCount() { 
      // TODO Auto-generated method stub 
      return list.size(); 
     } 

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

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

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // TODO Auto-generated method stub 
      ViewHolder holder; 
      if(convertView ==null) 
      { 
       convertView = mInlfater.inflate(R.layout.list_item,false); 
       holder = new ViewHolder(); 
       holder.b1 = (Button)convertView.findViewById(R.id.button1); 
       holder.tv1 = (TextView)convertView.findViewById(R.id.textView1); 
       holder.tv2 = (TextView)convertView.findViewById(R.id.textView2); 
       holder.tv3 = (TextView)convertView.findViewById(R.id.textView3); 
       convertView.setTag(holder); 

      } 
      else 
      { 
       holder =(ViewHolder) convertView.getTag(); 
      } 
      HashMap<String,String> map = list.get(position); 
      holder.tv1.setText(map.get("name")); 
       holder.tv2.setText(map.get("description")); 
       holder.tv3.setText(map.get("price")); 
       holder.b1.setOnClickListener(new OnClickListener() 
       { 

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

       } 


       }); 
      return convertView; 
     } 
     static class ViewHolder 
     { 
      Button b1; 
      TextView tv1,tv2,tv3; 
     } 
    } 
+0

如何獲取按鈕上的項目名稱單擊?不能使用位置,因爲它不是最終的,如果聲明爲最終所有項目將是相同的! –

+1

@MahdiRafatjah @MahdiRafatjah你可以使用設置標籤的按鈕,並獲得相同的onCLick使用視圖v。你應該使用recycelrview而不是listview – Raghunandan

1

你必須設置裏面你CustomAdapter的getView聽衆。以下是一個示例

public class ListAdapter extends ArrayAdapter<Item> { 
private List<Item> items; 
public ListAdapter(Context context, int textViewResourceId) { 
    super(context, textViewResourceId);  
} 

public ListAdapter(Context context, int resource, List<Item> items) { 
    super(context, resource, items); 
    this.items = items; 
} 

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

    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi; 
     vi = LayoutInflater.from(getContext()); 
     v = vi.inflate(R.layout.itemlistrow, null); // your rowlayout 

    } 

    // suppose a button id in rawlayout is btn1 
    Button btn1 = (Button) v.findViewById(R.id.btn); 
    btn.setOnClicListener(listener); 

    return v; 

} 
+0

他沒有自定義適配器。 – Raghunandan

+1

此外(http://www.vogella.com/articles/AndroidListView/article.html)資源可以幫助您瞭解適配器如何工作 –

相關問題