问题: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")