Пользовательский адаптер Listview не может выбрать элемент

Я пробовал все решения, которые нашел здесь, в stackoverflow, но похоже, что ни одно из них не работает.

Вот моя основная деятельность:

public class MerchantLocatorActivity extends AppCompatActivity implements OnMapReadyCallback {


    public void init(){
        merchantLocatorResponseObject = new MerchantLocatorResponse();
        merchantLocatorResponseObject.setTitle("Spherical");
        merchantLocatorResponseObject.setAddress("8007 Pioneer St, Kapitolyo, Mandaluyong, 1550 Metro Manila");
        merchantLocatorResponseObject.setLatitude( 14.573249);
        merchantLocatorResponseObject.setLongitude(121.057022);
        merchantLocatorObjectArray.add(merchantLocatorResponseObject);
        merchantLocatorResponseObject = new MerchantLocatorResponse();
        merchantLocatorResponseObject.setTitle("Globe");
        merchantLocatorResponseObject.setAddress("SCT, 584 Shaw Blvd, Mandaluyong, 1552 Metro Manila");
        merchantLocatorResponseObject.setLatitude(14.585095);
        merchantLocatorResponseObject.setLongitude(121.048893);
        merchantLocatorObjectArray.add(merchantLocatorResponseObject);
        merchantLocatorResponseObject = new MerchantLocatorResponse();
        merchantLocatorResponseObject.setTitle("Sparndium");
        merchantLocatorResponseObject.setAddress("Xavier, San Juan, 1502 Metro Manila");
        merchantLocatorResponseObject.setLatitude(14.601918);
        merchantLocatorResponseObject.setLongitude(121.042169);
        merchantLocatorObjectArray.add(merchantLocatorResponseObject);
        addMarker();
    }


    @OnClick(R.id.fab)
    public void showAccToDialog() {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        View alertView = LayoutInflater.from(this).inflate(R.layout.dialog_biller, null);
        alertDialogBuilder.setView(alertView);
        final AlertDialog dialog = alertDialogBuilder.create();
        dialog.show();
        final ListView listViewBillers = (ListView) dialog.findViewById(R.id.biller_institutions_listview);
        if (listViewBillers != null) {
            MerchantLocatorAdapter adapter = new MerchantLocatorAdapter(
                    this, R.layout.merchant_locator_adapter,  merchantLocatorObjectArray);
            listViewBillers.setAdapter(adapter);
            listViewBillers.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    geoLocate(merchantLocatorObjectArray,position);
                    DebugUtils.log("TESTTESTACTIVITYZXC");
                    DebugUtils.showToast(MerchantLocatorActivity.this,"HAHAHAH");
                    dialog.dismiss();
                }
            });

            final EditText mSearchedittext = (EditText) dialog.findViewById(R.id.search_edittext);
            mSearchedittext.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                }

                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                    final ArrayList<MerchantLocatorResponse> searchResultObject = new ArrayList<>();
                    searchResultObject.clear();
                    for (int hay = 0; hay <= merchantLocatorObjectArray.size() - 1; hay++) {
                        if ( merchantLocatorObjectArray.get(hay).getTitle().toLowerCase().contains(charSequence)) {
                            searchResultObject.add( merchantLocatorObjectArray.get(hay));
                        }
                    }

                    MerchantLocatorAdapter adapter = new MerchantLocatorAdapter(
                            MerchantLocatorActivity.this, R.layout.merchant_locator_adapter,  searchResultObject);
                    listViewBillers.setAdapter(adapter);
                    listViewBillers.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> adapter, View view, int position, long arg) {
                            geoLocate(searchResultObject,position);
                            dialog.dismiss();
                        }
                    });
                }

                @Override
                public void afterTextChanged(Editable editable) {

                }
            });
        }
    }


}

Я удаляю часть кода, потому что считаю, что в этом нет необходимости, но дайте мне знать, есть ли какая-то часть, требующая пояснения.

В настоящее время в моей основной деятельности я вызываю диалоговое окно, которое содержит представление списка, и в моем представлении списка есть элементы.

Моя проблема в том, что я не могу выбрать ни один из своих элементов, даже если у меня есть прослушиватель setOnitemclick.

вот мой адаптер:

public class MerchantLocatorAdapter  extends BaseAdapter {

    private int resourceLayout;
    private Context mContext;
    ArrayList<MerchantLocatorResponse> merchantLocatorarray = new ArrayList<>();

    public MerchantLocatorAdapter(Context context, int resource, ArrayList<MerchantLocatorResponse> merchantLocatorResponsesobjectArray) {
        this.resourceLayout = resource;
        this.mContext = context;
        this.merchantLocatorarray = merchantLocatorResponsesobjectArray;
    }

    @Override
    public int getCount() {
        return merchantLocatorarray.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) mContext
                    .getSystemService(mContext.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(resourceLayout, parent, false);
        }

        TextView tt1 = (TextView) convertView.findViewById(R.id.field_name_textview);
        TextView tt2 = (TextView) convertView.findViewById(R.id.field_value_textview);
        ImageButton direction = (ImageButton) convertView.findViewById(R.id.direction);
        tt1.setText(merchantLocatorarray.get(position).getTitle());
        tt2.setText(merchantLocatorarray.get(position).getAddress());



        return convertView;
    }
}

вот мой макет для моего адаптера:

<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:card_view = "http://schemas.android.com/apk/res-auto"
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content">

    <android.support.v7.widget.CardView
        android:id = "@+id/card_view"
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        android:layout_gravity = "center"
        android:layout_margin = "8dp"
        android:elevation = "3dp">

        <LinearLayout
            android:id = "@+id/card_overflow"
            android:focusable = "true"
            android:clickable = "true"
            android:background = "#fff"
            android:paddingLeft = "16dp"
            android:paddingRight = "0dp"
            android:paddingTop = "10dp"
            android:paddingBottom = "10dp"
            android:layout_width = "match_parent"
            android:layout_height = "wrap_content"
            android:orientation = "vertical">

            <RelativeLayout
                android:layout_width = "match_parent"
                android:layout_height = "wrap_content"
                android:weightSum = "1">

                <TextView
                    android:id = "@+id/field_name_textview"
                    android:layout_width = "wrap_content"
                    android:layout_height = "wrap_content"
                    android:layout_marginBottom = "5dp"
                    android:layout_toLeftOf = "@+id/branch_btns"
                    android:layout_alignParentLeft = "true"
                    android:textSize = "17sp"
                    android:textStyle = "bold"
                    android:textColor = "@color/edittext_text"
                    android:text = "test"/>

                <LinearLayout
                    android:id = "@+id/branch_btns"
                    android:layout_width = "wrap_content"
                    android:layout_height = "wrap_content"
                    android:layout_alignParentRight = "true"
                    android:orientation = "horizontal"
                    >
                    <ImageButton
                        android:id = "@+id/direction"
                        android:layout_width = "50sp"
                        android:layout_height = "wrap_content"
                        android:src = "@drawable/ic_direction"
                        android:scaleType = "fitCenter"
                        android:background = "@color/translucent_clear_bg"
                        />

                    <ImageButton
                        android:id = "@+id/btn_branch_phone"
                        android:layout_width = "50sp"
                        android:layout_height = "wrap_content"
                        android:src = "@drawable/ic_call_phone"
                        android:scaleType = "fitCenter"
                        android:background = "@color/translucent_clear_bg"
                        />
                </LinearLayout>
            </RelativeLayout>

            <View
                android:id = "@+id/seperator"
                android:layout_width = "match_parent"
                android:layout_height = "2dp"
                android:layout_marginBottom = "5dp"
                android:background = "@android:color/darker_gray"
                android:visibility = "gone"
                android:layout_marginTop = "2dp"/>
            <TextView
                android:id = "@+id/field_value_textview"
                android:textSize = "14sp"
                android:textColor = "@color/edittext_tint"
                android:layout_marginTop = "5dp"
                android:layout_width = "match_parent"
                android:layout_height = "wrap_content"
                android:text = "test"/>



        </LinearLayout>
    </android.support.v7.widget.CardView>

</LinearLayout>

Я пробовал все решения, которые нашел здесь, в stackoverflow, но все еще не могу щелкнуть свой элемент. поэтому, пожалуйста, не помечайте это как дубликат.

Если есть какая-то часть кода, требующая разъяснения, оставьте комментарий, и я отвечу как можно скорее. Благодарю.

Проверить ответ

Sniffer 27.09.2018 14:38

В макете вашего элемента есть ImageButton, которые обычно блокируют событие щелчка. Попробуйте добавить android:descendantFocusability = "blocksDescendants в корневой макет вашего представления элементов. Надеюсь, это поможет!

i_A_mok 28.09.2018 05:52

@I_A_Mok сделает мой imageButton неактивным? извините, я понятия не имею о потомках. будет смотреть в это.

user10424110 28.09.2018 06:33

выяснил корень проблемы, я могу щелкнуть элемент, когда я пытаюсь щелкнуть за пределами просмотра карты. но когда я пытаюсь щелкнуть сам карточный просмотр, он не работает.

user10424110 28.09.2018 06:47
0
4
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Добавьте convertView.setOnclickListener() в свой код. Попробуйте код ниже в своем адаптере

  @Override
public View getView(final int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(mContext.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(resourceLayout, parent, false);
    }

    TextView tt1 = (TextView) convertView.findViewById(R.id.field_name_textview);
    TextView tt2 = (TextView) convertView.findViewById(R.id.field_value_textview);
    ImageButton direction = (ImageButton) convertView.findViewById(R.id.direction);
    tt1.setText(merchantLocatorarray.get(position).getTitle());
    tt2.setText(merchantLocatorarray.get(position).getAddress());

   convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               Toast.makeText(context, String.valueOf(position), Toast.LENGTH_SHORT).show();
            }
        });

    return convertView;
}  }

@stackoverflowlawrence, попробуйте отладить

Sniffer 28.09.2018 06:52
Ответ принят как подходящий

Попробуйте использовать Наблюдаемый в собственном адаптере:

// Define 
private final PublishSubject<MerchantLocatorResponse> onItemClick = PublishSubject.create();

// Create the observable method
public Observable<ConversationMessage> getObservable(){
    return onItemClick;
}

// Set the onClickListener into getView()
convertView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onItemClick.onNext(merchantLocatorarray.get(position));
    }
});

Затем в своей основной деятельности слушайте его и обрабатывайте щелчок:

@OnClick(R.id.fab)
public void showAccToDialog() {
    // bla bla bla
    listViewBillers.setAdapter(adapter);
    listViewBillers.getObservable().subscribe(geoLocate);
    // bla bla bla
}


Consumer<MerchantLocatorResponse> geoLocate = new Consumer<MerchantLocatorResponse>() {
    @Override
    public void accept(MerchantLocatorResponse mlr) {
        // Code after click event
    }
};

Добавьте эту библиотеку в свой градиент:

implementation "io.reactivex.rxjava2:rxjava:2.1.5"
implementation "io.reactivex.rxjava2:rxandroid:2.0.1"

Сам setOnclickListener не работает. я не могу щелкнуть по моему представлению. :(

user10424110 28.09.2018 05:04

Попробуйте установить android:clicable = "true" и android:focusable = "true" в родительском макете в resourceLayout

Lorenzo Vincenzi 28.09.2018 08:37

Другие вопросы по теме