【问题标题】:How to show another layout below the ListView如何在 ListView 下方显示另一个布局
【发布时间】:2019-06-25 23:13:21
【问题描述】:

我有一个扩展SQLiteOpenHelper 的数据库数据列表。 我可以读取数据,我可以保存新数据,但问题是我希望在ListView 下方显示另一个名为clear_history 的布局,所以我想做的是向我展示ListView 和@987654329 @列表下方。 我试图创建一个RecyclerView Adapter,但我无法实现。 因为我想要一个 textView 可用于单击侦听器并删除数据库列表。 下面是我想要的列表中的照片。 第一张照片是实际设计。 第二张照片是我想要的。

这是我的代码。

DatabaseHelper.class

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String TABLE_NAME = "people_table";
    private static final String COL1 = "ID";
    private static final String COL2 = "name";

    public DatabaseHelper(Context context) {
        super(context, TABLE_NAME, null, 1);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COL2 +" TEXT)";
        db.execSQL(createTable);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP IF TABLE EXISTS " + TABLE_NAME);
        onCreate(db);
    }
    public boolean addData(String item) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL2, item);
        long result = db.insert(TABLE_NAME, null, contentValues);

        //if date as inserted incorrectly it will return -1
        if (result == -1) {
            return false;
        } else {
            return true;
        }
    }
    public Cursor getData(){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "SELECT * FROM " + TABLE_NAME;
        Cursor data = db.rawQuery(query, null);
        return data;
    }

    public Cursor getItemID(String name){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "SELECT " + COL1 + " FROM " + TABLE_NAME +
                " WHERE " + COL2 + " = '" + name + "'";
        Cursor data = db.rawQuery(query, null);
        return data;
    }

    public void updateName(String newName, int id, String oldName){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "UPDATE " + TABLE_NAME + " SET " + COL2 +
                " = '" + newName + "' WHERE " + COL1 + " = '" + id + "'" +
                " AND " + COL2 + " = '" + oldName + "'";
        db.execSQL(query);
    }
    public void deleteName(int id, String name){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "DELETE FROM " + TABLE_NAME + " WHERE "
                + COL1 + " = '" + id + "'" +
                " AND " + COL2 + " = '" + name + "'";
        db.execSQL(query);
    }
}

片段历史.XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <ListView android:id="@+id/lvHistory" android:longClickable="true"
        android:layout_width="match_parent" android:layout_height="match_parent"
        android:listSelector="@android:color/transparent" android:soundEffectsEnabled="false"
        android:overScrollMode="never" />
    <LinearLayout android:gravity="center" android:orientation="vertical"
        android:id="@+id/linLayoutEmptyList" android:paddingBottom="32.0dip" android:visibility="gone"
        android:layout_width="fill_parent" android:layout_height="fill_parent">
        <ImageView android:layout_gravity="center" android:id="@+id/ivHistoryPage"
            android:layout_width="@dimen/history_query_empty"
            android:layout_height="@dimen/history_query_empty"
            android:layout_marginBottom="@dimen/history_query_empty_margin"
            android:src="@drawable/ic_history" />
        <TextView android:textSize="20.0sp" android:textColor="@color/blue_title"
            android:gravity="center" android:layout_gravity="center" android:id="@+id/tvHistoryPage"
            android:layout_width="fill_parent" android:layout_height="wrap_content"
            android:text="@string/SVEmptyHistoryTableMessage" android:lineSpacingExtra="2.0sp" />
    </LinearLayout>
</LinearLayout>

history_item.XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"
    android:background="@drawable/selector_btn_home"
    android:id="@+id/historyLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ImageView android:id="@id/ivHistory" style="@style/ivHistory" />
    <TextView android:id="@+id/historyName" android:layout_height="38dp" style="@style/TextViewQuery"/>
    <ImageView android:id="@+id/imgViewSetQuery" style="@style/ImageViewSetQuery" />
    <TextView android:textSize="@dimen/search_font" android:textColor="@android:color/white"
        android:gravity="center" android:id="@+id/btnDeleteHistory" android:background="@color/red" android:paddingLeft="5.0dip"
        android:paddingRight="5.0dip" android:visibility="gone" android:longClickable="false"
        android:layout_width="wrap_content" android:layout_height="fill_parent" android:text="@string/Delete" />
</LinearLayout>

FragmentHistory.class

public class FragmentHistory extends Fragment {
    View paramView;
    public  TextView textView, showDeleteButton, noSearch;
    public ImageView showHistoryQuery;

    DatabaseHelper mDatabaseHelper;

    private ListView mListView;
    private LinearLayout noQueries;
    ListAdapter listAdapter;
    private final Handler handler = new Handler();

    public FragmentHistory() {
    }
    private boolean switchOnOff;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        paramView = inflater.inflate(R.layout.fragment_history, container, false);
        textView = paramView.findViewById(R.id.historyName);
        noSearch = paramView.findViewById(R.id.tvHistoryPage);
        mListView = paramView.findViewById(R.id.lvHistory);
        noQueries = paramView.findViewById(R.id.linLayoutEmptyList);
        noSearch.setTextColor(Color.GRAY);
        mDatabaseHelper = new DatabaseHelper(getActivity());
        doTheAutoRefresh();
        populateListView();
        ((MainActivity)getActivity()).setFragmentRefreshListener(new MainActivity.FragmentRefreshListener() {
            @Override
            public void onRefresh() {
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                ft.detach(FragmentHistory.this).attach(FragmentHistory.this).commit();
            }
        });

        return paramView;
    }


    private void doTheAutoRefresh() {
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                updateView(); // this is where you put your refresh code
                doTheAutoRefresh();
            }
        }, 1000);
    }
    private void populateListView() {


        //get the data and append to a list
        Cursor data = mDatabaseHelper.getData();
        ArrayList<String> listData = new ArrayList<>();
        while (data.moveToNext()) {
            listData.add(data.getString(1));
        }
        if (data.getCount() != 0) {
            ListAdapter adapter = new ArrayAdapter<String>(getActivity(), R.layout.history_item, R.id.historyName, listData);
            mListView.setAdapter(adapter);
        } else {
            mListView.setVisibility(View.GONE);
            noQueries.setVisibility(View.VISIBLE);
        } 

}

clear_history.XML

<TextView
    android:id="@+id/btnClearSearch"
    android:textSize="15sp"
    android:textColor="@android:color/black"
    android:background="@drawable/selector_btn_home"
    android:paddingLeft="@dimen/history_left_padding"
    android:paddingTop="8dp"
    android:paddingBottom="8dp"
    android:layout_width="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:text="@string/SVSRClearHistoryCellTitle"
    android:layout_height="fill_parent">

</TextView>

【问题讨论】:

    标签: android listview android-fragments android-recyclerview android-listview


    【解决方案1】:

    据我了解,您看不到“清晰”的 TextView。如果是这种情况,只需转到您的 XML 并将 ListView 和 TextView 嵌套在垂直线性布局中。然后调整您希望两者的显示方式。

    【讨论】:

    • 我试图在 ListView 下方包含布局,但如果可能的话,最好创建一个适配器来完成所有这些,并且只在 Fragment 中调用该适配器,因为您可以查看db 是空的,它向我展示了其他内容。
    • 所以你希望 TextView 仅在 db 不为空时出现?您可以在适配器中以布尔值的形式检查此条件,然后相应地设置其可见性。
    • 是的,只有当 db 不为空时我没有适配器。
    • 1.打开 guides.codepath.com/android/Using-an-ArrayAdapter-with-ListView 了解如何编写 ArrayAdapter。 2. 检查适配器的状况。例如,如果 db 返回一个列表,则使用自定义布尔方法检查它是否为空。然后,当您从数据库中获取列表并相应地显示 TextView 时,您可以在活动中使用该方法。
    • 比如上面的代码。我假设 lisData 是数据库返回的字符串列表。您可以像这样检查空条件:public void setViews() { if (listData.isEmpty() || listData == null) { //Hide the textView } } //不确定检查 null 是否有点过分,但我会这样做。您必须包含一个 else 语句,以便在列表不为空时显示 TextView
    【解决方案2】:

    试试这个

    <?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="match_parent"
        android:orientation="vertical">
    
        <ListView
            android:id="@+id/lvHistory"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@id/linLayoutEmptyList"
            android:listSelector="@android:color/transparent"
            android:longClickable="true"
            android:overScrollMode="never"
            android:soundEffectsEnabled="false" />
    
        <LinearLayout
            android:id="@+id/linLayoutEmptyList"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:gravity="center"
            android:orientation="vertical"
            android:paddingBottom="32.0dip"
            android:visibility="visible">
    
            <ImageView
                android:id="@+id/ivHistoryPage"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:src="@drawable/ic_fav" />
    
            <TextView
                android:id="@+id/tvHistoryPage"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:gravity="center"
                android:lineSpacingExtra="2.0sp"
                android:text="SVEmptyHistoryTableMessage"
                android:textSize="20.0sp" />
        </LinearLayout>
    </RelativeLayout>
    

    【讨论】:

    • @Spritzig 在你的FragmentHistory.XML
    • 我已经写了你的xml,但问题是它显示了两个textView,也许我还不清楚。我想当列表不为空时向我显示数据,如果为空,则在数据下方显示LinearLayout,它的 ID 为 linLayoutEmptyList
    猜你喜欢
    • 2011-05-25
    • 2011-10-05
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多