岚思榛 2024-05-31 13:44 采纳率: 25%
浏览 5

android项目想从数据库取值,用表格形式显示在页面

问题:android项目想从数据库取值,用表格形式显示在页面,用固定数据已经可以显示在页面上了,但是使用动态数据赋值不上,首次接触android项目,还是有很多不理解的地方,还请各位兄台指教
代码

package com.example.myapplication.AsyncTask;

import android.os.AsyncTask;
import com.example.myapplication.model.TBdMateriall;
import com.example.myapplication.util.DBUtil;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class DatabaseOperationTask extends AsyncTask<Void, Void, List<TBdMateriall>> {

    public interface OnDataLoadedListener {
        void onDataLoaded(List<TBdMateriall> materials);
    }

    private OnDataLoadedListener mDataLoadedListener;

    public DatabaseOperationTask(OnDataLoadedListener listener) {
        mDataLoadedListener = listener;
    }

    @Override
    protected List<TBdMateriall> doInBackground(Void... voids) {
        List<TBdMateriall> materials  =  new ArrayList<>();
        Connection connection = DBUtil.getConnection();
        if (connection != null) {
            try {
                Statement statement = connection.createStatement();
                // 执行查询操作
                ResultSet resultSet = statement.executeQuery("SELECT * FROM 表名");
                // 处理查询结果
                while (resultSet.next()) {
                    TBdMateriall material = new TBdMateriall();
                    material.setFPKID(resultSet.getInt("FPKID"));
                    material.setFNAME(resultSet.getString("FNAME"));
                    material.setFUSEORGID(resultSet.getInt("FUSEORGID"));
                    material.setFFORBIDREASON(resultSet.getString("FFORBIDREASON"));

                    materials.add(material);
                }
                // 关闭资源
                resultSet.close();
                statement.close();
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        return materials;
    }

    @Override
    protected void onPostExecute(List<TBdMateriall> materials) {
        // 调用回调方法传递数据
        mDataLoadedListener.onDataLoaded(materials);
    }

}



```java
package com.example.myapplication;

import android.os.AsyncTask;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.myapplication.AsyncTask.DatabaseOperationTask;
import com.example.myapplication.model.TBdMateriall;
import com.example.myapplication.ui.main.NoscrollListView;
import com.example.myapplication.ui.main.SyncHorizontalScrollView;
import com.example.myapplication.util.DBUtil;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private NoscrollListView mLeft;
    private LeftAdapter mLeftAdapter;

    private NoscrollListView mData;
    private DataAdapter mDataAdapter;

    private SyncHorizontalScrollView mHeaderHorizontal;
    private SyncHorizontalScrollView mDataHorizontal;

    private List<String> mListData;

    //当Activity被创建时,系统会调用这个方法
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //调用父类的onCreate方法
        super.onCreate(savedInstanceState);
        //设置Activity的布局文件为activity_main.xml
        setContentView(R.layout.activity_main);

        //调用initView()方法来初始化视图组件
        initView();
    }

    //用于初始化视图组件和数据
    private void initView(){
        //通过findViewById方法获取布局文件中的NoscrollListView控件,并分别赋值给mLeft和mData变量
        mLeft = (NoscrollListView) findViewById(R.id.lv_left);
        mData = (NoscrollListView) findViewById(R.id.lv_data);

        //通过findViewById方法获取布局文件中的SyncHorizontalScrollView控件,
        //并分别赋值给mDataHorizontal和mHeaderHorizontal变量
        mDataHorizontal = (SyncHorizontalScrollView) findViewById(R.id.data_horizontal);
        mHeaderHorizontal = (SyncHorizontalScrollView) findViewById(R.id.header_horizontal);

        //调用mDataHorizontal的setScrollView方法,将mHeaderHorizontal作为参数传入,实现水平滚动同步
        mDataHorizontal.setScrollView(mHeaderHorizontal);
        //调用mHeaderHorizontal的setScrollView方法,将mDataHorizontal作为参数传入,实现水平滚动同步
        mHeaderHorizontal.setScrollView(mDataHorizontal);

        //创建一个ArrayList对象mListData,并向其中添加元素
        mListData = new ArrayList<>();
        mListData.add("1");
        mListData.add("2");
        mListData.add("3");
        mListData.add("4");
        mListData.add("5");
        mListData.add("6");
        mListData.add("7");
        mListData.add("8");
        mListData.add("9");
        mListData.add("10");
        mListData.add("11");
        mListData.add("12");
        mListData.add("13");
        mListData.add("14");
        mListData.add("15");
        mListData.add("16");
        mListData.add("17");
        mListData.add("18");
        mListData.add("19");
        mListData.add("20");

        //创建一个LeftAdapter对象mLeftAdapter,并将其设置为mLeft的适配器
        mLeftAdapter= new LeftAdapter();
        mLeft.setAdapter(mLeftAdapter);

        //创建一个DataAdapter对象mDataAdapter,并将其设置为mData的适配器
        mDataAdapter = new DataAdapter();
        mData.setAdapter(mDataAdapter);
    }


      class DataAdapter extends BaseAdapter implements DatabaseOperationTask.OnDataLoadedListener{

        //返回数据列表mListData的大小,即数据的总数
        @Override
        public int getCount() {
            return mListData.size();
        }

        //根据传入的位置参数position,从数据列表mListData中获取对应位置的数据项
        @Override
        public Object getItem(int position) {
            return mListData.get(position);
        }

        //返回数据项的位置,这里直接返回传入的位置参数position
        @Override
        public long getItemId(int position) {
            return position;
        }

        //根据传入的位置参数position,为ListView或GridView等视图组件生成一个视图
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            //首先判断convertView是否为空
            if(convertView == null){
                //如果为空,则创建一个新的ViewHolder对象
                holder = new ViewHolder();
                //并使用LayoutInflater将item_data布局文件加载为一个View对象
                convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_data, null);
                //从这个View对象中查找TextView和LinearLayout控件,
                //并将它们分别赋值给ViewHolder对象的tvData和linContent属性
                holder.tvData = (TextView) convertView.findViewById(R.id.tv_data);

                holder.linContent = (LinearLayout) convertView.findViewById(R.id.lin_content);
                //将ViewHolder对象设置为convertView的标签,以便复用
                convertView.setTag(holder);
            }else{
                //如果convertView不为空,则直接从convertView的标签中获取ViewHolder对象
                holder = (ViewHolder) convertView.getTag();
            }

            return convertView;
        }

        @Override
        public void onDataLoaded(List<TBdMateriall> materials) {
            // 将数据赋值给 holder.linContent  (调取不到holder,爆红)
            holder.tvData.setText(materials.toString());
        }

        //ViewHolder类:一个内部类,用于存储视图组件中的控件引用
        class ViewHolder {
            TextView tvData;
            LinearLayout linContent;
        }
    }


}

效果图

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/d7b556dbf28c4e14b62e2710bd3a4bec.png "#left")
  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-05-31 13:44
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    从你提供的代码和描述来看,你已经成功地从数据库中获取了数据,但是遇到了两个主要问题:

    1. 动态数据无法正确赋值到表格视图中
    2. onDataLoaded方法中无法访问到holder对象

    针对这两个问题,我将提供一些解决方案:

    问题1: 动态数据赋值问题

    onDataLoaded方法中,你需要更新mListData列表,然后调用mDataAdapter.notifyDataSetChanged()来通知适配器数据已经发生变化,这样视图就会更新显示新数据。

    修改onDataLoaded方法如下:

    @Override
    public void onDataLoaded(List<TBdMateriall> materials) {
        // 更新数据列表
        mListData.clear();
        for (TBdMateriall material : materials) {
            mListData.add(material.toString()); // 假设你想要将对象转换为字符串显示
        }
        // 通知适配器数据已更新
        mDataAdapter.notifyDataSetChanged();
    }
    

    问题2: onDataLoaded中无法访问holder对象

    holder对象是在getView方法中定义的局部变量,它的作用域仅限于getView方法内部。因此,你不能在onDataLoaded方法中直接访问它。你需要在DataAdapter内部类中定义一个成员变量来保存当前的ViewHolder,然后在getView方法中更新这个成员变量。

    修改DataAdapter内部类如下:

    class DataAdapter extends BaseAdapter implements DatabaseOperationTask.OnDataLoadedListener {
        // 添加一个成员变量来保存当前的ViewHolder
        private ViewHolder currentHolder;
    
        // ... 其他代码保持不变 ...
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_data, null);
                holder.tvData = convertView.findViewById(R.id.tv_data);
                holder.linContent = convertView.findViewById(R.id.lin_content);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
    
            // 保存当前的ViewHolder到成员变量
            currentHolder = holder;
    
            // 假设你想要将TBdMateriall对象的某个属性显示在tvData上
            // 你需要在onDataLoaded方法中设置数据
            // holder.tvData.setText(/* 你的数据 */);
    
            return convertView;
        }
    
        // ... 其他代码保持不变 ...
    }
    

    请注意,onDataLoaded方法中不应该直接设置视图数据,因为这个方法在后台线程中执行,而UI更新必须在主线程中进行。你应该在onDataLoaded中更新数据列表,并在getView方法中根据当前位置来设置视图数据。

    参考资料

    希望这些修改能够帮助你解决问题。如果你还有其他疑问或需要进一步的帮助,请随时提问。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月31日

悬赏问题

  • ¥15 matlab支持向量机使用错误
  • ¥99 利用C/C++语言,使用TCP/IP协议,编一个简易聊天程序
  • ¥15 如何使用python 实现对串口/dev/ttyUSB0进行上锁,使得该串口只能在一个python脚本中使用,其他脚本不能操作这个串口
  • ¥15 晶体塑性有限元——Damask求解
  • ¥30 设计一个图形用户界面来控制你机械臂的运动
  • ¥30 3d打印机无法识别到SD卡,如何解决?(相关搜索:格式化)
  • ¥15 前端返回pdf时不显示内容
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图