【问题标题】:Create a search activity like in instagram and twitter在 instagram 和 twitter 中创建搜索活动
【发布时间】:2019-01-31 13:27:46
【问题描述】:

在我的项目中,我希望搜索活动在搜索活动(餐厅和餐点)中显示两种类型的数据,并且我想像在 Twitter 和 Instagram 中一样实现它,我的方法如下:

在搜索活动中,我创建了两个片段,每个片段都有一个简单的列表视图,启动应用程序时会显示我的数据,但列表视图不会显示所有项目,而是让它们滚动(在 Instagram搜索活动,它以全高显示建议的和最近的项目)

这是代码

搜索活动:

package com.byshy.light.Activities;

import android.content.pm.ActivityInfo;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.WindowManager;
import com.byshy.light.Fragments.SearchRestaurantsFragment;
import com.byshy.light.R;
import com.byshy.light.SearchMealsFragment;

public class SearchActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.search_restaurants_frag, new SearchRestaurantsFragment()).commit();

        FragmentTransaction transaction2 = getSupportFragmentManager().beginTransaction();
        transaction2.replace(R.id.search_meals_frag, new SearchMealsFragment()).commit();

    }

}

搜索活动 xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Activities.SearchActivity">

<FrameLayout
    android:layout_alignParentTop="true"
    android:id="@+id/search_container"
    android:layout_width="match_parent"
    android:layout_height="56dp"
    android:background="@color/colorPrimary"
    android:transitionName="search_bar">

    <EditText
        android:id="@+id/main_screen_search_bar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginStart="10dp"
        android:layout_marginTop="7dp"
        android:layout_marginEnd="10dp"
        android:layout_marginBottom="7dp"
        android:background="@drawable/curved_layout"
        android:hint="@string/search"
        android:inputType="text"
        android:padding="10dp" />

</FrameLayout>

<ScrollView
    android:layout_alignParentBottom="true"
    android:layout_below="@id/search_container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <FrameLayout
            android:id="@+id/search_restaurants_frag"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        </FrameLayout>

        <FrameLayout
            android:id="@+id/search_meals_frag"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        </FrameLayout>

    </LinearLayout>

</ScrollView>

</RelativeLayout>

餐厅片段:

package com.byshy.light.Fragments;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.byshy.light.R;

public class SearchRestaurantsFragment extends Fragment {

ListView lv1;

public SearchRestaurantsFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View root = inflater.inflate(R.layout.fragment_search_restaurants, container, false);

    lv1 = root.findViewById(R.id.search_restaurants_list_view);

    String[] items1 = new String[3];

    items1[0] = "res1";
    items1[1] = "res2";
    items1[2] = "res3";

    ArrayAdapter<String> aa1 = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, items1);

    lv1.setAdapter(aa1);

    return root;
}

}

膳食片段:

package com.byshy.light;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class SearchMealsFragment extends Fragment {

ListView lv2;

public SearchMealsFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View root = inflater.inflate(R.layout.fragment_search_meals, container, false);

    lv2 = root.findViewById(R.id.search_meals_list_view);

    String[] items2 = new String[10];

    items2[0] = "meal1";
    items2[1] = "meal2";
    items2[2] = "meal3";
    items2[3] = "meal4";
    items2[4] = "meal5";
    items2[5] = "meal6";
    items2[6] = "meal7";
    items2[7] = "meal8";
    items2[8] = "meal9";
    items2[9] = "meal10";

    ArrayAdapter<String> aa2 = new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, items2);

    lv2.setAdapter(aa2);

    return root;
}

}

fragments xml 基本相同,只是有一些 id 不同,所以我只发布一个:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".SearchMealsFragment">

<RelativeLayout
    android:id="@+id/small_search_restaurants_bar"
    android:layout_width="match_parent"
    android:layout_height="35dp"
    android:background="@color/white"
    android:clickable="true"
    android:focusable="true"
    android:foreground="?android:attr/selectableItemBackground">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginStart="10dp"
        android:text="@string/meals"
        android:textSize="15sp"
        android:textStyle="bold" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_centerVertical="true"
        android:layout_marginEnd="10dp"
        android:text="@string/more"
        android:textColor="@color/colorPrimaryDark"
        android:textSize="15sp" />

</RelativeLayout>

<ListView
    android:id="@+id/search_meals_list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</ListView>

</LinearLayout>

【问题讨论】:

    标签: java android xml


    【解决方案1】:

    在互联网上没有找到任何有用的东西后,我想出了一个新的方法来解决这个问题。

    我的新方法更有效,它通过为搜索结果创建一个模型来工作,该模型包含一个字符串和一个整数来指示视图是标题还是结果,然后创建一个包含线性布局的项目视图如果视图不是标题,则隐藏,此逻辑在适配器内部完成。

    这是代码:

    这是 search_item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal"
        android:clickable="false"
        android:focusable="false"
        android:foreground="?android:attr/selectableItemBackground">
    
        <LinearLayout
            android:orientation="vertical"
            android:id="@+id/search_item_back_bar"
            android:layout_width="match_parent"
            android:layout_centerVertical="true"
            android:background="@color/colorPrimary"
            android:layout_height="2dp">
    
        </LinearLayout>
    
        <TextView
            android:background="#f9f9f9"
            android:layout_marginStart="16dp"
            android:paddingStart="5dp"
            android:paddingEnd="5dp"
            android:id="@+id/search_result"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="@string/test"
            android:textSize="20sp" />
    
    </RelativeLayout>
    

    新的 searchActivity.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".Activities.SearchActivity">
    
        <FrameLayout
            android:id="@+id/search_container"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:background="@color/colorPrimary"
            android:transitionName="search_bar">
    
            <EditText
                android:id="@+id/main_screen_search_bar"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginStart="10dp"
                android:layout_marginTop="7dp"
                android:layout_marginEnd="10dp"
                android:layout_marginBottom="7dp"
                android:background="@drawable/curved_layout"
                android:hint="@string/search"
                android:inputType="text"
                android:padding="10dp" />
    
        </FrameLayout>
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/search_activity_results"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
        </android.support.v7.widget.RecyclerView>
    
    </LinearLayout>
    

    searchActivity.java

    package com.byshy.light.Activities;
    
    import android.content.pm.ActivityInfo;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.WindowManager;
    import com.byshy.light.Adapters.SearchResultsAdapter;
    import com.byshy.light.Models.SearchResult;
    import com.byshy.light.R;
    
    import java.util.ArrayList;
    
    public class SearchActivity extends AppCompatActivity {
    
    private RecyclerView searchRV;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    
        searchRV = findViewById(R.id.search_activity_results);
        searchRV.setHasFixedSize(true);
        searchRV.setLayoutManager(new LinearLayoutManager(this));
    
        ArrayList<SearchResult> results = new ArrayList<>();
        results.add(new SearchResult("Restaurants", 1));
        results.add(new SearchResult("res1"));
        results.add(new SearchResult("res2"));
        results.add(new SearchResult("res3"));
        results.add(new SearchResult("Meals", 1));
        results.add(new SearchResult("meal1"));
        results.add(new SearchResult("meal2"));
        results.add(new SearchResult("meal3"));
        results.add(new SearchResult("meal4"));
        results.add(new SearchResult("meal5"));
        results.add(new SearchResult("meal6"));
    
        SearchResultsAdapter adapter = new SearchResultsAdapter(results);
    
        searchRV.setAdapter(adapter);
    
    }
    
    }
    

    SearchResultsAdapter.java

    package com.byshy.light.Adapters;
    
    import android.support.annotation.NonNull;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    import com.byshy.light.Models.SearchResult;
    import com.byshy.light.R;
    import java.util.ArrayList;
    
    public class SearchResultsAdapter extends RecyclerView.Adapter<SearchResultsAdapter.SearchResultViewHolder> {
    
    private ArrayList<SearchResult> mData;
    
    public SearchResultsAdapter(ArrayList<SearchResult> data) {
        mData = data;
    }
    
    @NonNull
    @Override
    public SearchResultViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.search_item, viewGroup, false);
        return new SearchResultViewHolder(v);
    }
    
    @Override
    public void onBindViewHolder(@NonNull SearchResultViewHolder searchResultViewHolder, int i) {
        SearchResult searchResult = mData.get(i);
        searchResultViewHolder.result.setText(searchResult.getContent());
        if (searchResult.getType() == 0) {
            searchResultViewHolder.backBar.setVisibility(View.GONE);
            searchResultViewHolder.setClickable(true);
            ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) searchResultViewHolder.result.getLayoutParams();
            params.leftMargin = 8;
        }
    }
    
    @Override
    public int getItemCount() {
        return mData.size();
    }
    
    class SearchResultViewHolder extends RecyclerView.ViewHolder {
    
        private TextView result;
        private LinearLayout backBar;
        private View view;
    
        public SearchResultViewHolder(@NonNull View itemView) {
            super(itemView);
            view = itemView;
            result = itemView.findViewById(R.id.search_result);
            backBar = itemView.findViewById(R.id.search_item_back_bar);
        }
    
        public void setClickable(boolean clickable) {
            view.setClickable(clickable);
            view.setFocusable(clickable);
        }
    
    }
    
    }
    

    the end product

    【讨论】:

      猜你喜欢
      • 2011-03-11
      • 2017-02-27
      • 2012-05-06
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 2023-02-20
      相关资源
      最近更新 更多