0

我以編程方式在列表視圖適配器中創建了一個表視圖。對於第一次我創建了一個適配器佈局:Android:自定義列表視圖,適配器中的表視圖

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/black" 
    android:stretchColumns="*" 
    android:id="@+id/tablelayout" > 
</ableLayout> 

那我已經在做的適配器是:

public class DemoAdapter extends ArrayAdapter<String> { 
    //Global Variable declaration 
    Context myContext; 
    String[] key, value, loop; 

    public DemoAdapter(Context context, String[] key, String[] value, String[] loop){ 
     super(context, R.layout.demo_screen_adapter, loop); 
     this.myContext = context; 
     this.key = key; 
     this.value = value; 
     this.loop = loop; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent){ 
     View row = convertView; 
     if (row == null){ 
      // get reference to the activity 
      LayoutInflater inflater = ((Activity) myContext).getLayoutInflater(); 
      // Inflate the custom text which will replace the default text view 
      //list_item is a simple linear layout which contain textView1 in it. 
      row = inflater.inflate(R.layout.demo_screen_adapter, parent, false); 
     } 

     TableLayout tableLayout = (TableLayout) row.findViewById(R.id.tablelayout); 
     for(int i=0; i<5; i++){ 
      TableRow tableRow = new TableRow(myContext); 
      tableRow.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT)); 

      TextView tvKey = new TextView(myContext); 
      tvKey.setText(key[(position*5)+i]); 
      tvKey.setTextColor(Color.WHITE); 
      tvKey.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT)); 
      tableRow.addView(tvKey); 

      TextView tvValue = new TextView(myContext); 
      tvValue.setText(value[(position*5)+i]); 
      tvValue.setTextColor(Color.WHITE); 
      tvValue.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT)); 
      tableRow.addView(tvValue); 
      tableLayout.addView(tableRow, new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.MATCH_PARENT)); 
     } 
     return row; 
    } 
} 

這是工作好。在我的每個列表項中都有一個包含兩列和五行的表視圖。

現在問題是:

我想在列表項的點擊獲取所述特定的值。我無法這樣做。 我的嘗試是:

@Override 
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { 
    Toast.makeText(this, ""+(String) arg0.getItemAtPosition(position), Toast.LENGTH_LONG).show(); 
} 

但它顯示了我點擊的位置。

我該怎麼做,請指導我。

回答

1

在您的自定義適配器。使用持有人。

這是我的自定義適配器

import java.util.ArrayList; 

import com.samplelogin.CustomerDetails; 
import com.samplelogin.R; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.TextView; 

public class UserCustomAdapter extends ArrayAdapter<Customers> { 
    Context context; 
    int layoutResourceId; 
    ArrayList<Customers> data = new ArrayList<Customers>(); 

    public UserCustomAdapter(Context context, int layoutResourceId, 
      ArrayList<Customers> data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     UserHolder holder = null; 

     if (row == null) { 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 
      holder = new UserHolder(); 
      holder.textName = (TextView) row.findViewById(R.id.textView1); 
      holder.textAddress = (TextView) row.findViewById(R.id.textView2); 
      holder.textLocation = (TextView) row.findViewById(R.id.textView3); 
      holder.btnEdit = (Button) row.findViewById(R.id.button1); 

      row.setTag(holder); 
     } else { 
      holder = (UserHolder) row.getTag(); 
     } 
     Customers user = data.get(position);   
     holder.textName.setText(user.getName()); 
     holder.textAddress.setText(user.getAddress()); 
     holder.textLocation.setText(""); 

     holder.btnEdit.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Customers user = data.get(position); 
       user.setTID(user.getID()); 
       user.setTName(user.getName()); 
       user.setTAddress(user.getAddress()); 
       user.setTTelNo(user.getTelNo()); 
       user.setTMobileNo(user.getMobileNo()); 
       user.setTFaxNo(user.getFaxNo()); 

       Intent intent = new Intent(context, CustomerDetails.class); 
       context.startActivity(intent); 
      } 
     }); 
     return row; 

    } 

    static class UserHolder { 
     TextView textName; 
     TextView textAddress; 
     TextView textLocation; 
     Button btnEdit; 
     Button btnDelete; 
    } 

} 

而且在我的活動。我把數據就可以通過:

聲明你的變量

// Customer 
    ListView CustomerList; 
    UserCustomAdapter CustomerAdapter; 
    ArrayList<Customers> CustomerArray = new ArrayList<Customers>(); 
    Button addCustomer; 

將填補了一個數據你的價值。

 // Customer Tab 
cdb = new CustomerDB(getApplicationContext()); 
int custcount = cdb.getCustomerCount(); 
if (custcount > 0) { 
    List<Customers> cdbL = cdb.getAllCustomers(); 
    int listSize = cdbL.size(); 

    for (int i = 0; i < listSize; i++) { 

     CustomerArray.add(new Customers(cdbL.get(i).getDBName() 
       .toString(), cdbL.get(i).getDBAddress().toString(), 
       cdbL.get(i).getDBTelNo().toString(), cdbL.get(i) 
         .getDBMobileNo().toString(), cdbL.get(i) 
         .getDBFaxNo().toString(), cdbL.get(i).getDBID() 
         .toString())); 
    } 
} 

現在,從您的列表中。將您的數據傳輸到您的自定義適配器

// set item into adapter 
CustomerAdapter = new UserCustomAdapter(MainMaintenance.this, 
     R.layout.maintenancetab, CustomerArray); 
CustomerList = (ListView) findViewById(R.id.lvCustomer); 
CustomerList.setItemsCanFocus(false); 
CustomerList.setAdapter(CustomerAdapter); 

在這裏,您可以單擊該項目並執行所需操作。在這個示例中,我將數據傳遞給公共類中的列表,然後進入下一個活動。

// get on item click listener 
CustomerList.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
      long arg3) { 
     // TODO Auto-generated method stub 
     Customers user = CustomerArray.get(arg2); 
     user.setTID(user.getID()); 
     user.setTName(user.getName()); 
     user.setTAddress(user.getAddress()); 
     user.setTTelNo(user.getTelNo()); 
     user.setTMobileNo(user.getMobileNo()); 
     user.setTFaxNo(user.getFaxNo()); 

     Intent intent = new Intent(MainMaintenance.this, 
       CustomerDetails.class); 
     startActivity(intent); 
    } 
}); 

在自定義適配器setOnClickListener是,如果你把一個按鈕,在您自定義適配器:)如果你會是迷惑只是告訴我:)

我希望這個示例代碼會給你一個想法並幫助你。

相關問題