Android仿QQ空间发表动态
效果展示图:
功能描述:用户点击+会进入发表动态的界面,发表成功后跳转到个人首页。
后续完善:增加个人头像的上传,对界面进行优化,增加点赞和评论的功能。
主要采用listview对内容进行展示,对sqlite数据库进行增加和查询。
代码:
adapter
package com.example.yunzhi.adapter; import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import com.example.yunzhi.R;
import com.example.yunzhi.utils.Bean; import java.util.List; public class Temp extends RecyclerView.Adapter<Temp.TempViewHolder>{ private Context mContext;
private List<Bean> list;
public Temp (Context context, List<Bean> list){
this.mContext=context;
this.list=list;
}
public void setList(List<Bean> list) {
this.list=list;//构造方法的作用
}
@NonNull
@Override
public TempViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
TempViewHolder holder=new TempViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_recycler_view,parent,false));
return holder; } @Override
public void onBindViewHolder(@NonNull TempViewHolder holder, int position) {
final Bean item=list.get(position); holder.home_tv2.setText(item.getContents());
holder.home_tv3.setText(item.getDate()); } @Override
public int getItemCount() {
return list==null?0:list.size();
} //绑定单元格空间
class TempViewHolder extends RecyclerView.ViewHolder{
// ImageView home_me;
// TextView home_tv1;
TextView home_tv2;
TextView home_tv3;//时间 public TempViewHolder(@NonNull View itemView) {
super(itemView); // home_me=itemView.findViewById(R.id.home_me);
// home_tv1=itemView.findViewById(R.id.home_tv1);
home_tv2=itemView.findViewById(R.id.home_tv2);
home_tv3=itemView.findViewById(R.id.home_tv3);
}
} }
service
package com.example.yunzhi.service; import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; public class DatabaseHelper extends SQLiteOpenHelper {
static String name="test.db";
static int dbVersion=1;
public DatabaseHelper(Context context) {
super(context, name, null, dbVersion);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql="create table info(id integer primary key autoincrement,contents varchar(255),date varchar(20))";
db.execSQL(sql);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists info");//用户注册的表
onCreate(db);
}
}
package com.example.yunzhi.service; import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import com.example.yunzhi.utils.Bean; import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; public class UserService {
private DatabaseHelper dbHelper;
public UserService(Context context){dbHelper=new DatabaseHelper(context);} //发表说说的功能
public boolean publish(Bean bean){
SQLiteDatabase sdb=dbHelper.getReadableDatabase();
Date date0 = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String date = simpleDateFormat.format(date0);
String sql="insert into info(contents,date) values(?,?)";
Object obj[]={bean.getContents(),date};
sdb.execSQL(sql,obj);
return true;
}
public List<Bean> queryAll(){
List<Bean> list=new ArrayList<>();
Bean bean=null;
SQLiteDatabase db=dbHelper.getReadableDatabase();
Cursor c=db.query("info",null,null,null,null,null,null,null);
if(c!=null&&c.getCount()>0){
list=new ArrayList<>();
while(c.moveToNext()){
bean=new Bean();
bean.setContents(c.getString(c.getColumnIndex("contents")));
bean.setDate(c.getString(c.getColumnIndex("date")));
bean.setId(c.getInt(c.getColumnIndex("id")));
list.add(bean);
}
}
return list;
} }
utils
package com.example.yunzhi.utils; public class Bean {
private int id;
private String contents;
private String date; public Bean() { } public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getContents() {
return contents;
} public void setContents(String contents) {
this.contents = contents;
} public String getDate() {
return date;
} public void setDate(String date) {
this.date = date;
} public Bean(int id, String contents, String date) {
this.id = id;
this.contents = contents;
this.date = date;
}
}
AddActivity
package com.example.yunzhi; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; import com.example.yunzhi.service.UserService;
import com.example.yunzhi.utils.Bean; import java.text.SimpleDateFormat;
import java.util.Date; public class AddActivity extends AppCompatActivity { private Button add_back;
private Button add_pb;
private EditText add_ed1;
private TextView add_tv3;
Date date0 = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String date = simpleDateFormat.format(date0); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
findViews();
add_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(AddActivity.this,HomeActivity.class);
startActivity(intent);
}
});
add_pb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String contents=add_ed1.getText().toString();
System.out.println(contents);
String time=add_tv3.getText().toString();
Log.i("TAG", contents + "_" + time);
UserService userService=new UserService(AddActivity.this);
Bean bean=new Bean();
bean.setContents(contents);
bean.setDate(time);
userService.publish(bean);
Intent intent=new Intent(AddActivity.this,HomeActivity.class);
Toast.makeText(AddActivity.this,"发表成功",Toast.LENGTH_LONG).show();
startActivity(intent);
}
});
} private void findViews() {
add_back = findViewById(R.id.add_back);
add_pb=findViewById(R.id.add_pb);
add_ed1=findViewById(R.id.add_ed1);
add_tv3=findViewById(R.id.add_tv3);
add_tv3.setText(date);
}
}
MainActivity
package com.example.yunzhi; import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat; import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; import java.util.List; public class MainActivity extends AppCompatActivity { private Button btn1;
private Button btn7; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViews();
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,HomeActivity.class);
startActivity(intent);
}
});
btn7.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,TreeActivity.class);
startActivity(intent);
}
});
} private void findViews() { btn1 = findViewById(R.id.my_btn_3);
btn7=findViewById(R.id.my_btn_7);
}
}
HomeActivity
package com.example.yunzhi; import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView; import com.example.yunzhi.adapter.Temp;
import com.example.yunzhi.service.UserService;
import com.example.yunzhi.utils.Bean; import java.util.List; public class HomeActivity extends AppCompatActivity { private ImageView home_add;
private RecyclerView rec;
private final Activity mContext=HomeActivity.this;
private UserService userDao;
private Temp adapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
findViews();
initDate(); home_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(HomeActivity.this,AddActivity.class);
startActivity(intent);
}
});
} private void initDate() {
userDao =new UserService(mContext);
List<Bean> list=userDao.queryAll();
adapter=new Temp(mContext,list);
rec.setAdapter(adapter);
} private void findViews() {
home_add = findViewById(R.id.home_add);
rec=findViewById(R.id.rec);
rec.setLayoutManager(new LinearLayoutManager(mContext));
DividerItemDecoration divider = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL);
divider.setDrawable(ContextCompat.getDrawable(this,R.drawable.recycler_item));
rec.addItemDecoration(divider);
}
}
layout
main


<?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=".MainActivity"> <TextView
android:id="@+id/my_1"
android:layout_width="match_parent"
android:layout_height="35dp"
android:text="我"
android:gravity="center"/> <RelativeLayout
android:id="@+id/my_info_1"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_marginTop="10dp"
android:background="@color/white"
android:padding="20dp"> <ImageView
android:id="@+id/my_btn_1"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentLeft="true"
android:background="@drawable/main_view_1"/> <TextView
android:id="@+id/my_text_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="23dp"
android:layout_toRightOf="@id/my_btn_1"
android:text="用户"
android:textSize="30sp"
android:textStyle="bold"/> <ImageView
android:id="@+id/my_btn_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="-79dp"
android:src="@mipmap/erweima" />
</RelativeLayout> <Button
android:id="@+id/my_btn_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:background="@color/white"
android:drawableLeft="@mipmap/home_in"
android:text="个人空间"
android:gravity="center_vertical"
android:drawablePadding="15dp"
android:textSize="25sp"
/>
<Button
android:id="@+id/my_btn_4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:layout_marginTop="10dp"
android:drawableLeft="@mipmap/in_class"
android:text="我的课程"
android:gravity="center_vertical"
android:textSize="25sp"
android:drawablePadding="9dp"/>
<Button
android:id="@+id/my_btn_5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:layout_marginTop="10dp"
android:drawableLeft="@mipmap/book"
android:text="笔记本"
android:textSize="25sp"
android:gravity="center_vertical"
android:drawablePadding="15dp"/>
<Button
android:id="@+id/my_btn_6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:layout_marginTop="10dp"
android:drawableLeft="@mipmap/set"
android:text="设置"
android:textSize="25sp"
android:gravity="center_vertical"
android:drawablePadding="15dp"/>
<Button
android:id="@+id/my_btn_7"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:layout_marginTop="10dp"
android:drawableLeft="@mipmap/set"
android:text="思维导图"
android:textSize="25sp"
android:gravity="center_vertical"
android:drawablePadding="15dp"/> </LinearLayout>
home


<?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=".HomeActivity"> <RelativeLayout
android:id="@+id/line1"
android:layout_width="match_parent"
android:padding="10dp"
android:layout_height="200dp">
<ImageButton
android:id="@+id/home_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/back"
android:background="@color/white"/> <ImageView
android:id="@+id/home_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/add"
android:layout_alignParentRight="true"/> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="个人空间"
android:layout_marginLeft="130dp"
android:textSize="25dp"/> <ImageView
android:id="@+id/home_me"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_below="@+id/home_back"
android:layout_alignParentLeft="true"
android:layout_marginLeft="5dp"
android:layout_marginTop="60dp"
android:background="@drawable/main_view_1" />
<ImageView
android:id="@+id/home_see"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/eye"
android:layout_alignParentRight="true"
android:layout_below="@+id/home_add"
android:layout_marginTop="60dp"
android:layout_marginRight="150dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="总成长值:"
android:layout_alignParentRight="true"
android:layout_marginTop="95dp"
android:layout_marginRight="60dp"
android:textSize="15dp"/>
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/black"/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="56dp" /> <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rec"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteX="17dp" /> </LinearLayout>
add


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context=".AddActivity"
android:orientation="horizontal"> <RelativeLayout
android:id="@+id/add_r1"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="@color/blue">
<Button
android:id="@+id/add_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消"
android:background="#00000000"/> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="发动态"
android:textSize="25dp"
android:layout_centerInParent="true"/>
<Button
android:id="@+id/add_pb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发表"
android:layout_alignParentRight="true"
android:background="@null"/>
</RelativeLayout>
<View
android:id="@+id/view_1"
android:layout_below="@+id/add_r1"
android:layout_width="match_parent"
android:layout_height="5dp"
android:background="@color/block"/> <RelativeLayout
android:id="@+id/add_r2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/view_1"> <TextView
android:id="@+id/add_tv2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="用户名"
android:textSize="20dp"/>
<TextView
android:id="@+id/add_tv3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/add_tv2"
android:textSize="15dp"/> <EditText
android:id="@+id/add_ed1"
android:layout_below="@+id/add_tv3"
android:textSize="25dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="快来记录一下今天的成长吧!"/>
</RelativeLayout>
Android仿QQ空间发表动态的更多相关文章
- android仿qq空间、微信朋友圈图片展示
废话不多说,先上效果图 由于近期须要做朋友圈功能,所以在此记录一下,事实上非常多人不明确的一点应该是在图片的排列上面吧,不规则的排列,事实上非常easy的.就是一个GridView.然而你xml光光写 ...
- 仿QQ空间动态界面分享
先看看效果: 用极少的代码实现了 动态详情 及 二级评论 的 数据获取与处理 和 UI显示与交互,并且高解耦.高复用.高灵活. 动态列表界面MomentListFragment支持 下拉刷新与上拉加载 ...
- mui开发app之多图压缩与上传(仿qq空间说说发表)
欲实现效果图 提出需求点: 用户可自由添加删除替换多张图片,并且显示相应缩略图,限制为8张 用户可选择压缩图或直接上传原图功能 返回提醒用户会丢失填写的信息 下面一个个实现上述需求,从简单到复杂: 需 ...
- 仿QQ空间和微信朋友圈,高解耦高复用高灵活
先看看效果: 用极少的代码实现了 动态详情 及 二级评论 的 数据获取与处理 和 UI显示与交互,并且高解耦.高复用.高灵活. 动态列表界面MomentListFragment支持 下拉刷新与上拉加载 ...
- Fragment,仿QQ空间
转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9023451 在今天的这篇文章当中,我依然会以实战加理论结合 ...
- JS仿QQ空间鼠标停在长图片时候图片自动上下滚动效果
JS仿QQ空间鼠标停在长图片时候图片自动上下滚动效果 今天是2014年第一篇博客是关于类似于我们的qq空间长图片展示效果,因为一张很长的图片不可能全部把他展示出来,所以外层用了一个容器给他一个高度,超 ...
- Html - 仿QQ空间右下角工具浮动块
仿QQ空间右下角工具浮动块 <style type="text/css"> .cy-tp-area>.cy-tp-fixbtn>.cy-tp-text { ...
- Android仿QQ ios dialog,仿QQ退出向上菜单
Android仿QQ ios dialog,仿QQ退出向上菜单 EasyDialog两种模式 仿QQ退出向上菜单,自己定义向上菜单 github地址:https://gith ...
- Android 仿QQ首页的消息和电话的切换,首页的头部(完全用布局控制)
Android 仿QQ首页的消息和电话的切换,首页的头部(完全用布局控制) 首先贴上七个控制布局代码 1.title_text_sel.xml 字体颜色的切换 放到color文件夹下面 <?xm ...
随机推荐
- STM32启动文件详解及SystemInit函数分析(转)
;先在RAM中分配系统使用的栈,RAM的起始地址为0x2000_0000 ;然后在RAM中分配变量使用的堆 ;然后在CODE区(flash)分配中断向量表,flash的起始地址为0x0800_0000 ...
- 一篇文章搞懂密码学基础及SSL/TLS协议
SSL协议是现代网络通信中重要的一环,它提供了传输层上的数据安全.为了方便大家的理解,本文将先从加密学的基础知识入手,然后展开对SSL协议原理.流程以及一些重要的特性的详解,最后会扩展介绍一下国密SS ...
- 联合迭代器与生成器,enumerate() 内置函数真香!
花下猫语:Python 中很多内置函数的作用都非常大,比如说 enumerate() 和 zip(),它们使得我们在作迭代操作时极为顺手.这是一篇很多年前的 PEP,提议在 Python 2.3 版本 ...
- miniFTP项目实战六
项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...
- STM32—驱动RFID-RC522模块
文章目录 一.S50(M1)卡介绍 1.S50(M1)卡基础知识 2.内部信息 3.存取控制 4.数据块的存取控制 5.控制块的存取控 6.工作原理 7.M1与读卡器的通信 二.RC522工程代码详解 ...
- docker加速器,设置cdn
添加加速器 vim /etc/docker/daemon.json 添加如下内容 { "registry-mirrors": ["https://registry.doc ...
- 关于yii2学习笔记:gii的使用
yii2中的gii无疑是非常强大的代码生成工具,以下是我学习使用gii的一些技巧,跟大家分享一下. 以User为例,在数据库中,创建user表. /*Navicat MySQL Data Transf ...
- C++_COM 入门
COM即组件对象模型(Component Object Model)是一种跨应用和语言共享二进制代码的方法.COM明确指出二进制模块(DLLS和EXES)必须被编译成与指定的结构匹配,其定义的二进制标 ...
- .Net Core 集成 Redis
首先安装RedisServer 安装教程可参照 http://www.redis.cn/download.html 或者 https://www.runoob.com/redis/redis-inst ...
- C++ 中的User a, User b=a 和User a, User b, b=a的区别
#include <iostream>using namespace std;class User{ public: int age; int number; User() { cout ...