如何使 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;

}