如何使 Section ListView Header 不可点击?
How to make Section ListView Header unclickable?
我有一个部分列表视图,我有一个行和 Header。 Header show the month and year which Row 显示利润和东西。我为行创建了一个对话框,但每当我单击 Header 时,它都会提示我错误。如何使 Header 不可点击?
我的适配器Class
public class TransactionAdapter extends BaseAdapter {
ArrayList<Object> transactions;
Context c;
LayoutInflater inflater;
static final int ROW = 0;
static final int HEADER = 1;
public TransactionAdapter(Context c, ArrayList<Object> transactions){
this.c = c;
this.transactions = transactions;
}
//Get size of the Transaction ArrayList
@Override
public int getCount() {
return transactions.size();
}
//Get single transaction from the Transaction ArrayList
@Override
public Object getItem(int position) {
return transactions.get(position);
}
//Get Single transaction identifier from the Transaction ArrayList
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position){
//Check the current transaction is Transaction
if(getItem(position) instanceof ProfitTransactions){
return ROW;
}
return HEADER;
}
@Override
public int getViewTypeCount(){
return 2;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
//Type of View which is ROW(0) or HEADER(1)
int type = getItemViewType(position);
//If there is no View create it,
if (convertView == null) {
inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
switch (type) {
case ROW:
convertView = inflater.inflate(R.layout.activity_transaction_items, null);
break;
case HEADER:
convertView = inflater.inflate(R.layout.activity_transaction_header, null);
convertView.setBackgroundColor(Color.rgb(220,220,220));
default:
break;
}
}
switch (type){
case ROW:
ProfitTransactions transaction = (ProfitTransactions)getItem(position);
TextView tvDay = (TextView)convertView.findViewById(R.id.day);
TextView tvTID = (TextView)convertView.findViewById(R.id.tID);
TextView tvTotalPrice = (TextView)convertView.findViewById(R.id.totalPrice);
TextView tvTimeOrder = (TextView)convertView.findViewById(R.id.tvTime);
Log.d("transadapter","-----Test: " + Integer.parseInt(transaction.getDayOfOrder()));
tvDay.setText(transaction.getDayOfOrder()+ getDayNumberSuffix(Integer.parseInt(transaction.getDayOfOrder())));
tvTID.setText("TID: " + transaction.gettId());
tvTotalPrice.setText("+$"+String.format("%.2f", transaction.getTotalPrice()));
tvTimeOrder.setText("At: " + transaction.getTimeOfOrder());
break;
case HEADER:
String header = (String)getItem(position);
// from string to date
SimpleDateFormat inputFormat = new SimpleDateFormat("MM/yyyy");
Date date = null;
try {
date = inputFormat.parse(header);
} catch (ParseException e) {
e.printStackTrace();
}
// from date to string
SimpleDateFormat outputFormat = new SimpleDateFormat("MMM yyyy");
String dateTime = outputFormat.format(date);
TextView tvMonthYear = (TextView)convertView.findViewById(R.id.tvHeaderMonthYear);
tvMonthYear.setText(dateTime);
default:
break;
}
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ProfitTransactions transaction = (ProfitTransactions)getItem(position);
//Create the Dialog Box
AlertDialog.Builder builder = new AlertDialog.Builder(c);
//Put message in the Dialog Box
builder.setMessage("Name: " + transaction.getName() + "\n" +
"Price: " + transaction.getPrice() + "\n" +
"Quantity: " + transaction.getQuantity() + "\n" +
"Total Price: " + transaction.getTotalPrice() + "\n"
)
//If user click Yes
.setPositiveButton("Close", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
//Show the dialog after creating
AlertDialog dialog = builder.show();
}
});
return convertView;
}
}
我想要的预期结果是我希望包含月份和年份的 Header 不可点击并且不会响应任何内容。
与在 getView
方法中决定膨胀什么以及如何填充视图的方式相同,您可以将所需类型的 OnClickListener
设置为 null。您也可以使用 setClickable
方法。
在 getViewMethod 中使用这个
case HEADER:
convertView = inflater.inflate(R.layout.activity_transaction_header, null);
convertView.setBackgroundColor(Color.rgb(220,220,220));
convertView.setEnabled(false);
在convertView.setOnClickListener之前添加if逻辑判断convertView是header还是被选中的行!喜欢-
if(!convertView.equals("HEADER"))
{
your onClick listener.....
}
else
{
what you want to do if its headerview being the view selected...
}
目前您正在为每个视图注册点击侦听器。
您只想将其分配给行,而不是 headers,因为在处理程序中您正试图访问 ProcessTransaction
上的字段,这些字段仅出现在行上。
所以只需将您的点击侦听器代码拉入您的开关的 ROW
分支即可。
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
//Type of View which is ROW(0) or HEADER(1)
int type = getItemViewType(position);
//If there is no View create it,
if (convertView == null) {
inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
switch (type) {
case ROW:
convertView = inflater.inflate(R.layout.activity_transaction_items, null);
break;
case HEADER:
convertView = inflater.inflate(R.layout.activity_transaction_header, null);
convertView.setBackgroundColor(Color.rgb(220,220,220));
default:
break;
}
}
switch (type){
case ROW:
ProfitTransactions transaction = (ProfitTransactions)getItem(position);
TextView tvDay = (TextView)convertView.findViewById(R.id.day);
TextView tvTID = (TextView)convertView.findViewById(R.id.tID);
TextView tvTotalPrice = (TextView)convertView.findViewById(R.id.totalPrice);
TextView tvTimeOrder = (TextView)convertView.findViewById(R.id.tvTime);
Log.d("transadapter","-----Test: " + Integer.parseInt(transaction.getDayOfOrder()));
tvDay.setText(transaction.getDayOfOrder()+ getDayNumberSuffix(Integer.parseInt(transaction.getDayOfOrder())));
tvTID.setText("TID: " + transaction.gettId());
tvTotalPrice.setText("+$"+String.format("%.2f", transaction.getTotalPrice()));
tvTimeOrder.setText("At: " + transaction.getTimeOfOrder());
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ProfitTransactions transaction = (ProfitTransactions)getItem(position);
//Create the Dialog Box
AlertDialog.Builder builder = new AlertDialog.Builder(c);
//Put message in the Dialog Box
builder.setMessage("Name: " + transaction.getName() + "\n" +
"Price: " + transaction.getPrice() + "\n" +
"Quantity: " + transaction.getQuantity() + "\n" +
"Total Price: " + transaction.getTotalPrice() + "\n"
)
//If user click Yes
.setPositiveButton("Close", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
//Show the dialog after creating
AlertDialog dialog = builder.show();
}
});
break;
case HEADER:
String header = (String)getItem(position);
// from string to date
SimpleDateFormat inputFormat = new SimpleDateFormat("MM/yyyy");
Date date = null;
try {
date = inputFormat.parse(header);
} catch (ParseException e) {
e.printStackTrace();
}
// from date to string
SimpleDateFormat outputFormat = new SimpleDateFormat("MMM yyyy");
String dateTime = outputFormat.format(date);
TextView tvMonthYear = (TextView)convertView.findViewById(R.id.tvHeaderMonthYear);
tvMonthYear.setText(dateTime);
default:
break;
}
return convertView;
}
我有一个部分列表视图,我有一个行和 Header。 Header show the month and year which Row 显示利润和东西。我为行创建了一个对话框,但每当我单击 Header 时,它都会提示我错误。如何使 Header 不可点击?
我的适配器Class
public class TransactionAdapter extends BaseAdapter {
ArrayList<Object> transactions;
Context c;
LayoutInflater inflater;
static final int ROW = 0;
static final int HEADER = 1;
public TransactionAdapter(Context c, ArrayList<Object> transactions){
this.c = c;
this.transactions = transactions;
}
//Get size of the Transaction ArrayList
@Override
public int getCount() {
return transactions.size();
}
//Get single transaction from the Transaction ArrayList
@Override
public Object getItem(int position) {
return transactions.get(position);
}
//Get Single transaction identifier from the Transaction ArrayList
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position){
//Check the current transaction is Transaction
if(getItem(position) instanceof ProfitTransactions){
return ROW;
}
return HEADER;
}
@Override
public int getViewTypeCount(){
return 2;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
//Type of View which is ROW(0) or HEADER(1)
int type = getItemViewType(position);
//If there is no View create it,
if (convertView == null) {
inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
switch (type) {
case ROW:
convertView = inflater.inflate(R.layout.activity_transaction_items, null);
break;
case HEADER:
convertView = inflater.inflate(R.layout.activity_transaction_header, null);
convertView.setBackgroundColor(Color.rgb(220,220,220));
default:
break;
}
}
switch (type){
case ROW:
ProfitTransactions transaction = (ProfitTransactions)getItem(position);
TextView tvDay = (TextView)convertView.findViewById(R.id.day);
TextView tvTID = (TextView)convertView.findViewById(R.id.tID);
TextView tvTotalPrice = (TextView)convertView.findViewById(R.id.totalPrice);
TextView tvTimeOrder = (TextView)convertView.findViewById(R.id.tvTime);
Log.d("transadapter","-----Test: " + Integer.parseInt(transaction.getDayOfOrder()));
tvDay.setText(transaction.getDayOfOrder()+ getDayNumberSuffix(Integer.parseInt(transaction.getDayOfOrder())));
tvTID.setText("TID: " + transaction.gettId());
tvTotalPrice.setText("+$"+String.format("%.2f", transaction.getTotalPrice()));
tvTimeOrder.setText("At: " + transaction.getTimeOfOrder());
break;
case HEADER:
String header = (String)getItem(position);
// from string to date
SimpleDateFormat inputFormat = new SimpleDateFormat("MM/yyyy");
Date date = null;
try {
date = inputFormat.parse(header);
} catch (ParseException e) {
e.printStackTrace();
}
// from date to string
SimpleDateFormat outputFormat = new SimpleDateFormat("MMM yyyy");
String dateTime = outputFormat.format(date);
TextView tvMonthYear = (TextView)convertView.findViewById(R.id.tvHeaderMonthYear);
tvMonthYear.setText(dateTime);
default:
break;
}
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ProfitTransactions transaction = (ProfitTransactions)getItem(position);
//Create the Dialog Box
AlertDialog.Builder builder = new AlertDialog.Builder(c);
//Put message in the Dialog Box
builder.setMessage("Name: " + transaction.getName() + "\n" +
"Price: " + transaction.getPrice() + "\n" +
"Quantity: " + transaction.getQuantity() + "\n" +
"Total Price: " + transaction.getTotalPrice() + "\n"
)
//If user click Yes
.setPositiveButton("Close", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
//Show the dialog after creating
AlertDialog dialog = builder.show();
}
});
return convertView;
}
}
我想要的预期结果是我希望包含月份和年份的 Header 不可点击并且不会响应任何内容。
与在 getView
方法中决定膨胀什么以及如何填充视图的方式相同,您可以将所需类型的 OnClickListener
设置为 null。您也可以使用 setClickable
方法。
在 getViewMethod 中使用这个
case HEADER:
convertView = inflater.inflate(R.layout.activity_transaction_header, null);
convertView.setBackgroundColor(Color.rgb(220,220,220));
convertView.setEnabled(false);
在convertView.setOnClickListener之前添加if逻辑判断convertView是header还是被选中的行!喜欢-
if(!convertView.equals("HEADER"))
{
your onClick listener.....
}
else
{
what you want to do if its headerview being the view selected...
}
目前您正在为每个视图注册点击侦听器。
您只想将其分配给行,而不是 headers,因为在处理程序中您正试图访问 ProcessTransaction
上的字段,这些字段仅出现在行上。
所以只需将您的点击侦听器代码拉入您的开关的 ROW
分支即可。
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
//Type of View which is ROW(0) or HEADER(1)
int type = getItemViewType(position);
//If there is no View create it,
if (convertView == null) {
inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
switch (type) {
case ROW:
convertView = inflater.inflate(R.layout.activity_transaction_items, null);
break;
case HEADER:
convertView = inflater.inflate(R.layout.activity_transaction_header, null);
convertView.setBackgroundColor(Color.rgb(220,220,220));
default:
break;
}
}
switch (type){
case ROW:
ProfitTransactions transaction = (ProfitTransactions)getItem(position);
TextView tvDay = (TextView)convertView.findViewById(R.id.day);
TextView tvTID = (TextView)convertView.findViewById(R.id.tID);
TextView tvTotalPrice = (TextView)convertView.findViewById(R.id.totalPrice);
TextView tvTimeOrder = (TextView)convertView.findViewById(R.id.tvTime);
Log.d("transadapter","-----Test: " + Integer.parseInt(transaction.getDayOfOrder()));
tvDay.setText(transaction.getDayOfOrder()+ getDayNumberSuffix(Integer.parseInt(transaction.getDayOfOrder())));
tvTID.setText("TID: " + transaction.gettId());
tvTotalPrice.setText("+$"+String.format("%.2f", transaction.getTotalPrice()));
tvTimeOrder.setText("At: " + transaction.getTimeOfOrder());
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ProfitTransactions transaction = (ProfitTransactions)getItem(position);
//Create the Dialog Box
AlertDialog.Builder builder = new AlertDialog.Builder(c);
//Put message in the Dialog Box
builder.setMessage("Name: " + transaction.getName() + "\n" +
"Price: " + transaction.getPrice() + "\n" +
"Quantity: " + transaction.getQuantity() + "\n" +
"Total Price: " + transaction.getTotalPrice() + "\n"
)
//If user click Yes
.setPositiveButton("Close", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
//Show the dialog after creating
AlertDialog dialog = builder.show();
}
});
break;
case HEADER:
String header = (String)getItem(position);
// from string to date
SimpleDateFormat inputFormat = new SimpleDateFormat("MM/yyyy");
Date date = null;
try {
date = inputFormat.parse(header);
} catch (ParseException e) {
e.printStackTrace();
}
// from date to string
SimpleDateFormat outputFormat = new SimpleDateFormat("MMM yyyy");
String dateTime = outputFormat.format(date);
TextView tvMonthYear = (TextView)convertView.findViewById(R.id.tvHeaderMonthYear);
tvMonthYear.setText(dateTime);
default:
break;
}
return convertView;
}