简体   繁体   English

如何使Section ListView Header不可点击?

[英]How to make Section ListView Header unclickable?

I have a section listview and I have a Row and Header. 我有一个节列表视图,并且有一个行和标题。 Header show the month and year whereby Row Shows the profit and stuffs. 标头显示月份和年份,其中行显示利润和物料。 I have created a dialog box for the Row but whenever i click the Header it prompts me error. 我为“行”创建了一个对话框,但是每当我单击“标题”时,都会提示我错误。 How do I make the Header Unclickable ? 如何使标题不可点击?

My Adapter 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;

    }

}

The expected result I want is I want the Header which contains the Month and Year to be unclickable and will not respond anything. 我想要的预期结果是我希望包含月份和年份的标题不可单击,并且不会响应任何内容。

The same way you are making decisions on what to inflate and how to fill your views in getView method, you could set the OnClickListener to null in the desired type. 与决定要填充的内容以及如何在getView方法中填充视图的方式相同,可以将所需类型的OnClickListener设置为null。 You could use the setClickable method also. 您也可以使用setClickable方法。

Inside the getViewMethod use this 在getViewMethod内部使用此

case HEADER:
                convertView = inflater.inflate(R.layout.activity_transaction_header, null);
                convertView.setBackgroundColor(Color.rgb(220,220,220));
                convertView.setEnabled(false);

Before the convertView.setOnClickListener, add the if logic to check whether the convertView is a header or a row which is selected! 在convertView.setOnClickListener之前,添加if逻辑,以检查convertView是标题还是所选的行! like- 喜欢-

if(!convertView.equals("HEADER"))
{
your onClick listener.....
}
else
{
what you want to do if its headerview being the view selected...
}

Currently you're registering the click listener on every View. 当前,您正在每个视图上注册点击侦听器。 You only want to assign it to rows, not headers, because in the handler you are trying to access fields on the ProcessTransaction which are only present on rows. 您只想将其分配给行,而不是标题,因为在处理程序中,您试图访问仅存在于行上的ProcessTransaction上的字段。

So just pull your click listener code into the ROW branch of your switch. 因此,只需将您的点击侦听器代码拉到交换机的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;

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM